如何证明按引用传递值类型时重新赋值参数对调用方不可见?
值类型按引用传递的行为验证(情况A)
在C#中,通过ref关键字按引用传递值类型参数时,存在两种核心行为:
- 若方法修改参数指向实例的状态(对值类型而言就是直接修改其值或字段),变更会同步到调用方——这一点你已经清楚。
- 若方法将参数重新指向一个新的实例,这个变更不会传递给调用方。以下是验证该行为的正确代码:
using System; class Program { static void Main() { int originalNum = 10; Console.WriteLine($"调用方法前:originalNum = {originalNum}"); // 输出:调用方法前:originalNum = 10 ReassignRefValue(ref originalNum); Console.WriteLine($"调用方法后:originalNum = {originalNum}"); // 输出:调用方法后:originalNum = 10 } static void ReassignRefValue(ref int paramValue) { // 将参数重新指向一个全新的int实例 paramValue = new int(); paramValue = 20; Console.WriteLine($"方法内部:paramValue = {paramValue}"); // 输出:方法内部:paramValue = 20 } }
代码说明
- 调用方定义了
originalNum并赋值为10,通过ref传入ReassignRefValue方法。 - 在方法内部,我们先将
paramValue重新绑定到一个新的int实例,再赋值为20——此时方法内的变量值是20,但这只是修改了方法内引用指向的新实例。 - 回到调用方,
originalNum的数值依然是初始的10,说明这种重新指向新实例的操作并未影响到调用方的原始变量,完全符合情况A的描述。
对比情况B(修改实例状态)的示例,方便你区分:
// 自定义值类型 struct Counter { public int Count { get; set; } } static void ModifyCounterState(ref Counter counter) { // 修改已有实例的状态,而非重新指向新实例 counter.Count = 100; } // 调用方代码 Counter myCounter = new Counter { Count = 10 }; ModifyCounterState(ref myCounter); Console.WriteLine(myCounter.Count); // 输出:100,变更同步到调用方
内容的提问来源于stack exchange,提问作者haria arava
相关产品推荐
相关产品推荐

