时间:2021-05-19
1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值;
2. 方法定义和调用方法都必须显式使用 ref 或者 out关键字;
3. 通过ref 和 ref 特性,一定程度上解决了C#中的函数只能有一个返回值的问题。
传递到ref参数的参数必须初始化,否则程序会报错。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { int a = 1; int b = 2; Fun(ref a,ref b); Console.WriteLine("a:{0},b:{1}", a, b);//输出:3和4说明传入Fun方法是a和b的引用 } static void Fun(ref int a, ref int b) { a = 3; b = 4; } }}out关键字无法将参数值传递到out参数所在的方法中, out参数的参数值初始化必须在其方法内进行,否则程序会报错。
using System.Text;namespace ConsoleApp1{ class Program { static void Main(string[] args) { int a = 100; int b; Fun(out a, out b); Console.WriteLine("a:{0},b:{1}", a, b); } static void Fun(out int a, out int b) { //a = 1+2; if (a == 100) a = 2; b = 1; } }}代码里报错 “Use of unassigned out parameter 'a' ”
下面的代码是正确的。
using System;namespace ConsoleApp1{ class Program { static void Main(string[] args) { int a = 100; int b; Fun(out a, out b); Console.WriteLine("a:{0},b:{1}", a, b); } static void Fun(out int a, out int b) { a = 1+2; b = 1; } }}输出结果为:
注意点:
using System;namespace ConsoleApplication1{ class Program { public void SampleMethod(ref int i) { } public void SampleMethod(out int i) { } }}上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'”
尽管ref和out在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译上面的代码。
using System;namespace ConsoleApplication1{ class Program { public void SampleMethod(int i) { } public void SampleMethod(ref int i) { } }}上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'”
尽管ref和out在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译上面的代码。
using System;namespace ConsoleApplication1{ class Program { public void SampleMethod(int i) { } public void SampleMethod(ref int i) { } }}但是,如果一个方法采用ref或out参数,而另一个方法不采用这两个参数,则可以进行重载。
以上就是C# ref and out的使用小结的详细内容,更多关于C# ref and out的使用的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#中Out与Ref的区别,可以加深C#程序设计人员对Out和Ref用法的理解,具体分析如下:一、区别分析:Out和Ref作为参数传递到方法体中,
C#的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解。还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是
前言C#方法中参数类型有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细
ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。总结
在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢?MSDN