考虑这个代码:

public class Program
{
    private static void Main(string[] args)
    {
        var person1 = new Person { Name = "Test" };
        Console.WriteLine(person1.Name);

        Person person2 = person1;
        person2.Name = "Shahrooz";
        Console.WriteLine(person1.Name); //Output: Shahrooz
        person2 = null;
        Console.WriteLine(person1.Name); //Output: Shahrooz
    }
}

public class Person
{
    public string Name { get; set; }
}

显然,当将person1赋给person2并且person2Name属性被更改时,person1Name也将被更改.person1person2具有相同的引用.

为什么当为person2 = null时,person1变量也不为空?

推荐答案

对于同一对象,personperson2都是references.但这些是不同的参考.所以当你 run 的时候

person2 = null;

您仅更改了引用person2,而保留了引用person和相应的对象不变.

我想最好的解释是用一个简单的例子.以下是before person2 = null的情况:

在空赋值之前

这是图片after,赋值为空:

在此处输入图像描述

如您所见,在第二张图片中,person2没有引用任何东西(或者,严格地说,null,因为引用Nothing和引用null是不同的条件,请参见Rune FS的注释),而person仍然引用现有的对象.

.net相关问答推荐

.NET最小API BadRequest响应不返回正文

如何为多种文件类型设置 FileSystemWatcher 过滤器?

线程安全性的单元测试?

关于在 .NET 中干净地终止线程的问题

C# - 获取不包括隐藏文件的文件列表

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

.Include() 与 .Load() 在 EntityFramework 中的性能

是否有任何 x 次的 for 循环的更短/更简单的版本?

防止对话框在按钮的单击事件处理程序中关闭

在 .NET C# 中存储加密密钥的最佳方式

使用 IIS Express 托管网站(临时)

如何使用反射在 .NET 中调用重载方法

在 ToString() 之前判断 null

如何在多个解决方案之间共享相同的 Resharper 设置,无需人工干预?

立即检测客户端与服务器套接字的断开连接

为什么 double.NaN 不等于自身?

判断对象列表是否包含具有特定值的属性

了解 C# 中的协变和逆变接口

使用 LINQ 搜索树

如何为 Dapper 查询动态创建参数