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

本文通过具体的 C# 代码示例详细解释了 ref 关键字的作用,特别是在处理值类型和引用类型时的行为差异。文章展示了如何使用 ref 传递参数以实现变量值的变化,并对比了使用与未使用 ref 的不同效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 回顾以前的东西,突然对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、付费专栏及课程。

余额充值