You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何证明按引用传递值类型时重新赋值参数对调用方不可见?

值类型按引用传递的行为验证(情况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
    }
}

代码说明

  1. 调用方定义了originalNum并赋值为10,通过ref传入ReassignRefValue方法。
  2. 在方法内部,我们先将paramValue重新绑定到一个新的int实例,再赋值为20——此时方法内的变量值是20,但这只是修改了方法内引用指向的新实例。
  3. 回到调用方,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:20:54