[C#基础]ref和out的区别

在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢?

MSDN:
       ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
      out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

案例:

定义一个方法,求一个整数数组中的最大值,最小值,和,平均数。如果是一个方法只能有一个返回值,那只能每一个都得定义一个方法来实现,不过有了ref和out这实现起来就方便多了。

ref:

 1    static int GetIntResult(int[] arry, ref float avg, ref int max, ref int min)
 2         {
 3             int sum = 0;
 4             max = arry[0];
 5             min = arry[0];
 6             for (int i = 0; i < arry.Length; i++)
 7             {
 8                 sum += arry[i];
 9
10                 if (max < arry[i])
11                 {
12                     max = arry[i];
13                 }
14                 if (min > arry[i])
15                 {
16                     min = arry[i];
17                 }
18             }
19             avg = sum / arry.Length;
20             return sum;
21         }

然后在控制台中试着调用该方法:

1      static void Main(string[] args)
2         {
3             int[] arr = { 1,2,3,4,5,6,7,8,9};
4             float avg;
5             int max;
6             int min;
7             int sum = GetIntResult(arr, ref avg, ref max, ref min);
8         }

此时编译器就会提示画红线,错误:使用了未赋值的avg,max,min

 1       static void Main(string[] args)
 2         {
 3             int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 4             float avg = 0;
 5             int max = 0;
 6             int min = 0;
 7             int sum = GetIntResult(arr, ref avg, ref max, ref min);
 8             Console.WriteLine("和:{0}\t平均值:{1}\t最大值:{2}\t最小值:{3}", sum, avg, max, min);
 9             Console.Read();
10         }

运行结果:

总结:

ref这个关键字告诉c#编译器被传递的参数值指向与调用代码中变量相同的内存。这样,如果被调用的方法修改了这些值然后返回的话,调用代码的变量也就被修改了。

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中(avg,max,min的初始值为0,调用方法后值改变)。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

out:

换成out之后,上面的方法不再适用,报错,错误 : 控制离开当前方法之前必须对 out 参数“min”和"max"赋值。你会发现这里max和min在循环外并未初始化。所以才会出错。

修改后代码:

 

结果和上面一样。

总结:
       out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

结论:

关键字“ref“和”out”之间的唯一区别就是关键字”out“不要求调用代码初始化要传递的参数值。那么关键字‘ref”什么时候用呢?当您需要确保调用方法已经初始化参数值的时候,您就应该使用关键字“ref”。在上面例子中,能够使用“out“是因为被调用的方法并不依赖于被传递的变量的值。个中滋味慢慢体会......

时间: 2024-08-07 07:01:41

[C#基础]ref和out的区别的相关文章

Ref与Out的区别

Ref与Out的区别 ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递. 对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别. 总结起来,他们有如下语法区别: 1.ref传进去的参数必须在调用前初始化,out不必,即: int i; SomeMethod( ref i );//语法错误 SomeMethod( out i );//通过 2.ref传进去的参数在函数内部可以直接使用,而out不可: public void SomeMethod(

C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:       ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必

out,ref的作用和区别(转载)

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量.它们的区别是: 1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字.以满足匹配. 3.out适合用在需要retrun多个返回值

转载:C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:        ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都

Hive基础之各种排序的区别

order by 1.order by会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局排序): 只有一个reducer会导致当输入规模较大时,需要较长的计算时间,速度很非常慢: 2.hive.mapred.mode(默认值是nonstrict)对order by的影响 1)当hive.mapred.mode=nonstrict时,order by和关系型数据库中的order by功能一致,按照指定的某一列或多列排序输出: 2)当hive.mapred.mode=st

ref和out的区别,值类型和引用类型的使用

今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢 首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码 1.首先结果 i=0:ints[0]=0    i=0;ints[0]=100 2.ints作为一个引用类型在传入方法后,对ints[0]进行了赋值,是将引用类型的地址引用到了100这个值得堆上, 3.而值类型i引入到另外一个方法后进行赋值不会对原有字符串进行改变 4.ref就是为了解决这个问题,让值类型能够和引用类型一样在传入方法后值会

Ref和Out的区别

最近在许多论坛上看到关于了ref和out的区别,发现解释的都不非常理想. 我想抄写点官方的解释,然后再来我自己的解释//如下方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量.当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中. 当希望方法返回多个值时,声明 out 方法非常有用.使用 out 参数的方法仍然可以返回一个值.一个方法可以有一个以上的 out 参数. 若要使用 out 参数,必须将参数作为 out 参数显式传递到方法.out 参数的值不会传递到

out和ref的用法和区别

out和ref的用法和区别 函数参数默认是值传递,也就是“复制一份” 看个栗子: static void Main(string[] args) { int age = 10; IncAge(age); Console.WriteLine(age);//结果是10,因为函数参数默认是值传递,IncAge()对外面这个age没有影响 Console.ReadKey(); } static void IncAge(int age) { age++; } ref(reference:引用) ref必须

C# 中 in,out,ref 的作用与区别

In:过程不会改写In的内容 Out和out:传入的值不会被过程所读取,但过程可以写 ref:传入的值,过程会读,也会写 就象你把布料送到裁缝的一个收料箱(裁缝用这个区别是哪家客户) IN:这块布料,不能动,我取时还要原样(我取时会要不要这块料,是我自己的事,你管不着,但你不能把这块料做任何改变,你只能看这块料的质地.色彩等等,你要想改变这块料,那自已去照这块料的样子复制一个) Out和out:我可能给了你布料,也可能没给,也可能我给你的只是一张纸或一块羊皮,但我希望无论我给或没给,你都会给我一