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

为何C#中方法内重新分配参数后外部变量未更新?

C#引用类型参数赋值后外部未更新的原因解析

先看你给出的代码:

public class A
{
    public void Mt1(User user)
    {
        user.Name= "Brekeke";
    }

    public void Mt2(User user)
    {
        user = new ();
    }
}


[TestMethod]
public void TEST_DEBUG()
{
    User user1 = new();
    new A().Mt1(user1);
    Assert.IsTrue(user1.Name == "Brekeke"); // OK

    User user2 = null;
    new A().Mt2(user2);
    Assert.IsNotNull(user2); // Fails!
}

核心问题出在你混淆了引用类型和参数传递方式:C#里方法参数默认是值传递,哪怕参数是引用类型。

  • 针对Mt1:你传递的是user1引用的副本,这个副本和外部的user1指向堆上同一个User实例。修改user.Name本质是通过引用操作堆上对象的属性,外部自然能看到变化。
  • 针对Mt2:你传递的是user2(此时为null)的引用副本。方法里user = new();只是把这个副本引用指向了新创建的User实例,但外部的user2变量还是原来的null——因为你修改的是副本,不是原始变量本身。

如果想让外部的user2同步更新,需要把参数改成ref或out传递,这样方法里操作的就是原始变量的引用:

public void Mt2(ref User user)
{
    user = new ();
}

// 调用时也要加上ref关键字
new A().Mt2(ref user2);

修改后你的断言就能正常通过了。

内容的提问来源于stack exchange,提问作者A.D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:55:58