C#中ref和out的使用小结

ref 是传递参数的地址, out 是返回值,两者有一定的相同之处,不过也有不同点。
使用 ref 前必须对变量赋值, out 不用。
out 的函数会清空变量,即使变量已经赋值也不行,退出函数时所有 out 引用的变量都要赋值, ref 引用的可以修改,也可以不修改。
 
1 与所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值
2    2 、与所有的 ref 参数一样,数组类型的 ref 参数必须由调用方明确赋值。因此不需要由接受方明确赋值。可以将数组类型的 ref 参数更改为调用的结果。例如,可以为数组赋以 null 值,或将其初始化为另一个数组。
 
 
  对于值类型的变量,如果没有 ref ,那么在函数中修改了变量的值是不会影响到原来变量的,但如果加了 ref 则会影响。   
  对于引用类型的变量,无论是否使用 ref ,对对象变量的属性进行修改同样会影响原来的变量。但如果对这个对象变量重新 new 一个(重新赋值),则不会影响原来的。而使用了 ref 则会影响的        
  所以, ref 是否使用是针对变量级的,不是针对变量的属性的。                                                                                                                          
int   i=0;  
   
  int[]   iArr=new   int[10];  
   
  iArr[0]=1;  
   
  void   f1(int   i)  
  {  
      i=2;  
  }  
  void   f2(ref   int   i)  
  {  
      i=3;  
  }  
   
  void   f3(ref   int[]   arr)  
  {  
      arr[0]=4;  
  }  
   
  void   f4(int[]   arr)  
  {  
      arr[0]=5;  
  }  
   
  void   f5(ref   int[]   arr)  
  {  
      arr=new   int[20];  
  }  
   
  void   f6(int[]   arr)  
  {  
      arr=new   int[30];  
  }  
   
  调用以上函数:   
   
  f1(i);// 调用完后, i 的值不变   
  f2(ref   i);// 调用完后, i 的值变为 3  
  f3(ref   iArr);// 调用完后, iArr 的元素数量不变,第一个元素的值变为 4  
  f4(iArr);// 调用完后, iArr 的元素数量不边,第一个元素的值变为 5  
  f5(ref   iArr);// 调用完后, iArr 的元素数量变为 20 ,原来的 iArr 变成孤岛而不可以控制了。   
  f6(iArr);// 调用完后, iArr 的元素数量不变   
   
 
using System;
class TestApp
{
  static void outTest(out int x, out int y)
  {// 离开这个函数前,必须对 x y 赋值,否则会报错。
   //y = x;
   // 上面这行会报错,因为使用了 out 后, x y 都清空了,需要重新赋值,即使调用函数前赋过值也不行
   x = 1;
   y = 2;
  }
  static void refTest(ref int x, ref int y)
  {
   x = 1;
   y = x;
  }
  public static void Main()
  {
   //out test
   int a,b;
   //out 使用前,变量可以不赋值
   outTest(out a, out b);
   Console.WriteLine("a={0};b={1}",a,b);
   int c=11,d=22;
   outTest(out c, out d);
   Console.WriteLine("c={0};d={1}",c,d);
 
   //ref test
   int m,n;
   //refTest(ref m, ref n);
   // 上面这行会出错, ref 使用前,变量必须赋值
 
   int o=11,p=22;
   refTest(ref o, ref p);
   Console.WriteLine("o={0};p={1}",o,p);
  }
}
 
下面的两个示例说明 out ref 在将数组传递给方法上的用法差异。
示例 1
在此例中,在调用方( Main 方法)中声明数组 myArray ,并在 FillArray 方法中初始化此数组。然后将数组元素返回调用方并显示。
using System;
class TestOut
...{
   
static public void FillArray(out int[] myArray)
   
...{
      
// 
初始化数组(必须) :
      myArray =  new   int [5]  ... {1, 2, 3, 4, 5};
   }

   
static   public   void  Main()
   
... {
      
int [] myArray;  //  初始化数组 ( 不是必须的 !)

      // 
传递数组给(使用 out 方式的)调用方 :
      FillArray( out  myArray);

      
//  显示数组元素
      Console.WriteLine(" 数组元素是 :");
      
for  ( int  i=0; i < myArray.Length; i++)
         Console.WriteLine(myArray[i]);
   }
}

输出
数组元素是 :
1
2
3
4
5
示例 2
在此例中,在调用方( Main 方法)中初始化数组 myArray ,并通过使用 ref 参数将其传递给 FillArray 方法。在 FillArray 方法中更新某些数组元素。然后将数组元素返回调用方并显示。
using System;
class TestRef
...{
   
public static void FillArray(ref int[] arr)
   
...{
      
// 
根据需要创建一新的数组 ( 不是必须的 )
       if  (arr ==  null )
         arr = 
new   int [10];
      
//  否则填充数组,就可以了
      arr[0] = 123;
      arr[4] = 1024;
   }

   
static   public   void  Main ()
   
... {
      
// 初始化数组 :
       int [] myArray =  ... {1,2,3,4,5}; 

      
//  使用 ref 传递数组 :
      FillArray( ref  myArray);

      
// 显示更新后的数组元素 :
      Console.WriteLine(" 数组元素是 :");
      
for  ( int  i = 0; i < myArray.Length; i++)
         Console.WriteLine(myArray[i]);
   }
}

输出
数组元素是 :
123
2
3
4
1024
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值