要搞搞清楚的ref (引用)的用法

 回顾以前的东西,突然对ref很含混,特别找个例子清醒下:

值类型参数的例子(msdn):


输出结果是:

b
b
引用类型参数的例子:
2 using System;
 3 
 4 public class MyObject
 5 {
 6   public int Data;
 7 }
 8 
 9 public class MyClass 
10 {
11   public static void TestRef(ref MyObject m) 
12   {
13     // The value of MyObject.Data will be changed in the calling method
14     m.Data = 10;
15   }
16 
17   public static void TestNoRef(MyObject m) 
18   {
19     // The value of MyObject.Data will be unchanged in the calling method
20     m.Data = 20;
21   }
22   
23   public static void TestCreateRef(ref MyObject m) 
24   {
25     m = new MyObject();
26     m.Data = 100;
27   }
28   
29   public static void TestCreateNoRef(MyObject m) 
30   {
31     m = new MyObject();
32     m.Data = 200;
33   }
34 
35   public static void Main() 
36   {
37   
38     MyObject m = new MyObject();
39     m.Data = 1;
40     
41     TestRef(ref m);
42     Console.WriteLine(m.Data);
43     
44     TestNoRef(m);
45     Console.WriteLine(m.Data);
46     
47     TestCreateRef(ref m);
48     Console.WriteLine(m.Data);
49     
50     TestCreateNoRef(m);
51     Console.WriteLine(m.Data);
52   }
53 }

输出结果为:

10
20
100
100
TestRef 和 TestNoRef 方法中修改参数的值,相应变量的值都会更改,因为都是传递的引用。 但是在后面 TestCreateRef 和 TestCreateNoRef 两个方法中,它们的结果就不太一样了。 
在使用 ref 关键字的方法中重新创建实例的时候,不仅方法中变量的引用被更新,而且调用者中变量的引用也被同时更新。将好像是在调用者的范围内使用 new 关键字创建对象一样。 
而在不使用 ref 关键字的方法中只是将此方法中的变量的引用更改了,并没有更改调用者变量的引用。也就是说在 TestCreateNoRef 方法中对新创建的变量做任何更改,调用者都不会知道!
 2  using  System;
 3  public   class  MyClass 
 4  {
 5     public   static   void  TestRef( ref   char  i) 
 6    {
 7       //  The value of i will be changed in the calling method
 8      i  =   ' b ' ;
 9    }
10 
11     public   static   void  TestNoRef( char  i) 
12    {
13       //  The value of i will be unchanged in the calling method
14      i  =   ' c ' ;
15    }
16 
17     //  This method passes a variable as a ref parameter; the value of the 
18     //  variable is changed after control passes back to this method.
19     //  The same variable is passed as a value parameter; the value of the
20     //  variable is unchanged after control is passed back to this method.
21     public   static   void  Main() 
22    {
23    
24       char  i  =   ' a ' ;     //  variable must be initialized
25      TestRef( ref  i);   //  the arg must be passed as ref
26      Console.WriteLine(i);
27      TestNoRef(i);
28      Console.WriteLine(i);
29    }
30  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值