为何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.
相关产品推荐
相关产品推荐

