C#中的 ref 和 out

转载 2006年05月23日 11:13:00
使用C#一年多了,竟然是昨天才知道C# 中有 ref  和 out的用法
于是看了一会儿demo,大致搞懂是啥东西了。

这种方法的优点就是可以返回多个值,不再受函数返回一个值的限制,很爽。

其实也很简单,就好像C++里的&(引用)
传递的是实际参数的地址,修改参数值,就会导致直接将内存中该地址中的值修改掉
所以之后输出该参数的值将是修改之后的值

需要注意的是:属性不是变量,不能作为 out 参数传递。

还有如下重载也是不允许的
1class MyClass 
2{
3   public void MyMethod(out int i) {i = 10;}
4   public void MyMethod(ref int i) {i = 10;}
5}

6

对于ref 和 out给个简单的demo
相信一看就明白了

 1// PassingParams2.cs 
 2using System;
 3class PassingValByRef
 4{
 5    static void SquareIt(ref int x)
 6    // The parameter x is passed by reference.
 7    // Changes to x will affect the original value of myInt.
 8    {
 9        x *= x;
10        Console.WriteLine("The value inside the method: {0}", x);
11    }

12    public static void Main()
13    {
14        int myInt = 5;
15        Console.WriteLine("The value before calling the method: {0}",
16           myInt);
17        SquareIt(ref myInt);   // Passing myInt by reference.
18        Console.WriteLine("The value after calling the method: {0}",
19           myInt);
20    }

21}
 

输出
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 25

代码讨论
本示例中,传递的不是 myInt 的值,而是对 myInt 的引用。参数 x 不是 int 类型,它是对 int 的引用(本例中为对 myInt 的引用)。因此,当在方法内对 x 求平方时,实际被求平方的是 x 所引用的项:myInt。


但是ref 和 out 也存在一些区别:

与所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值。例如:

public static void MyMethod(out int[] arr) 
{
   arr = new int[10];   // definite assignment of arr
}

与所有的 ref 参数一样,数组类型的 ref 参数必须由调用方明确赋值。因此不需要由接受方明确赋值。可以将数组类型的 ref 参数更改为调用的结果。例如,可以为数组赋以 null 值,或将其初始化为另一个数组。例如:

public static void MyMethod(ref int[] arr) 
{
   arr = new int[10];   // arr initialized to a different array
}

下面给出两个demo

示例 1

在此例中,在调用方(Main 方法)中声明数组 myArray,并在 FillArray 方法中初始化此数组。然后将数组元素返回调用方并显示。

 

 1using System; 
 2class TestOut 
 3{
 4   static public void FillArray(out int[] myArray) 
 5   {
 6      // Initialize the array:
 7      myArray = new int[5{12345};
 8   }

 9
10   static public void Main() 
11   {
12      int[] myArray; // Initialization is not required
13
14      // Pass the array to the callee using out:
15      FillArray(out myArray);
16
17      // Display the array elements:
18      Console.WriteLine("Array elements are:");
19      for (int i=0; i < myArray.Length; i++)
20         Console.WriteLine(myArray[i]);
21   }

22}

23

输出
Array elements are:
1
2
3
4
5


示例 
2
在此例中,在调用方(Main 方法)中初始化数组 myArray,并通过使用 ref 参数将其传递给 FillArray 方法。在 FillArray 方法中更新某些数组元素。然后将数组元素返回调用方并显示。

 1using System; 
 2class TestRef 
 3{
 4   public static void FillArray(ref int[] arr) 
 5   {
 6      // Create the array on demand:
 7      if (arr == null)
 8         arr = new int[10];
 9      // Otherwise fill the array:
10      arr[0= 123;
11      arr[4= 1024;
12   }

13
14   static public void Main () 
15   {
16      // Initialize the array:
17      int[] myArray = {1,2,3,4,5};  
18
19      // Pass the array using ref:
20      FillArray(ref myArray);
21
22      // Display the updated array:
23      Console.WriteLine("Array elements are:");
24      for (int i = 0; i < myArray.Length; i++
25         Console.WriteLine(myArray[i]);
26   }

27}

28

输出

Array elements are:
123
2
3
4
1024

C#中方法参数 ref 与 out 的区别

方法中参数的类型有三种 in型参数 in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法 ref型参数 该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。 ...
  • jl1134069094
  • jl1134069094
  • 2016年01月13日 17:25
  • 1008

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

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键...
  • jadeflute
  • jadeflute
  • 2010年01月20日 22:13
  • 23289

c# ref out 区别 比较 汇总

ref(C# 参考) Visual Studio 2015 其他版本   ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果...
  • hejisan
  • hejisan
  • 2016年07月06日 00:05
  • 706

ref与out之间的区别整理

ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。 对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。 总结起来,他们有如下语法区别:  ...
  • xiaoning8201
  • xiaoning8201
  • 2011年10月21日 10:39
  • 8545

C#中ref和out的作用和区别

相同点:方法的定义和调用都必须显示使用ref、out关键字。都会导致参数按引用传递。 不同点:传递给ref关键字的参数必须赋初始值,而out不用。out关键字会清空变量,即使变量已经赋值也不行,退出...
  • qingYun1029
  • qingYun1029
  • 2010年10月15日 14:49
  • 4702

在C#中 ref和out的区别

在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功...
  • unity_http
  • unity_http
  • 2016年07月15日 20:36
  • 1436

c#中的关键字out是什么意思?ref是什么意思?它们有什么区别?

不知大家有没有遇到过需要一个函数返回多个值的情况。 当写代码要返回多个值的时候,当然可以返回一个数组来实现,但如果遇到需要返回的多个值的类型不同呢?这个时候怎么办? c#中,out关键字和ref关...
  • sinat_23079759
  • sinat_23079759
  • 2016年10月22日 22:14
  • 2253

C#中Out和Ref参数修饰符

在编程过程中对于函数之间的参数的传递一般分为两种:传值和传地址。下面为大家分析一下。  传值     比如你又一份文档,如果采用传值的话,相当于我复制了一份,因此我对我这份文档的修改都不会影响...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2014年10月02日 14:31
  • 2903

C# out、ref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。 out: class Program { /* * out、ref都是引用传递,传递后使用...
  • CommandBaby
  • CommandBaby
  • 2016年04月06日 14:53
  • 3863

【Lua】访问C#中的属性和方法-特殊情况-带有out和ref关键字

using System; using LuaInterface; namespace myLua { class MainClass { public string name = "Ocea...
  • sinat_20559947
  • sinat_20559947
  • 2015年08月28日 23:46
  • 3713
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中的 ref 和 out
举报原因:
原因补充:

(最多只允许输入30个字)