当存储该引用的局部变量设置为null时,为什么静态变量未设置为null?

Lea*_*ner 1 .net c# static-members pass-by-reference

我有以下代码:

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

public class InstanceManager
{
    public static Employee employee;

    public static Employee GetEmployee()
    {
        if(employee == null)
        {
            employee = new Employee {Name = "Tom"};
        }

        return employee;
    }
}

public class TestClass
{

    public void Test()
    {
        Employee emp = InstanceManager.GetEmployee();
        var name = emp.Name;
        emp = null;
        var name2 = InstanceManager.GetEmployee().Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

在该Test()方法中,局部变量emp引用InstanceManager.Employee对象.然后,我设置empnull.

  • 这是不是意味着我要InstanceManager.Employee参加null
  • 如果我调试这段代码,我发现employee静态变量InstanceManager不是null!为什么?

(我希望GetEmployee()在我之后调用此方法时,该方法将创建并返回新的Employee对象emp = null;.)

Bar*_*zKP 8

在此之后:

Employee emp = InstanceManager.GetEmployee();
Run Code Online (Sandbox Code Playgroud)

你的情况如下:

在此输入图像描述

当你这样做时:

emp = null;
Run Code Online (Sandbox Code Playgroud)

之后,你不会改变静态变量employee.您只是设置emp引用另一个(在这种情况下null)"位置".更准确地说 - 你说它不是指向任何东西.静态employee指向它的位置.这条线的效果可以这样形象化:

在此输入图像描述


ken*_*n2k 6

你在做什么基本上是:

Employee emp = InstanceManager.GetEmployee();
Run Code Online (Sandbox Code Playgroud)

emp现在是对employee实例的引用

emp = null;
Run Code Online (Sandbox Code Playgroud)

emp不再是对employee实例的引用

var name2 = InstanceManager.GetEmployee().Name;
Run Code Online (Sandbox Code Playgroud)

name2现在是对employee.Name实例的引用

你永远不会将null设置为InstanceManager.employee.btw甚至没有一个公共制定者.