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

时间:2013-12-11 12:35:59

标签: c# .net pass-by-reference static-members

我有以下代码:

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;
    }
}

Test()方法中,局部变量emp引用InstanceManager.Employee对象。然后,我将emp设置为null

  • 这是否意味着我将InstanceManager.Employee设为null
  • 如果我调试此代码,我发现employee的{​​{1}}静态变量不是InstanceManager!为什么?

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

4 个答案:

答案 0 :(得分:8)

这一行之后:

Employee emp = InstanceManager.GetEmployee();

你的情况如下:

enter image description here

当你这样做时:

emp = null;

之后,您不会更改静态变量employee。您只需将emp设置为引用另一个(在这种情况下为null)“位置”。更准确地说 - 你说它不是指向任何东西。静态employee始终指向它所在的位置。这条线的效果可以这样显示:

enter image description here

答案 1 :(得分:6)

你在做什么基本上是:

Employee emp = InstanceManager.GetEmployee();

emp现在是对employee实例

的引用
emp = null;

emp不再是对employee实例

的引用
var name2 = InstanceManager.GetEmployee().Name;

name2现在是对employee.Name实例

的引用

您永远不会将{null}设置为InstanceManager.employee。对于它来说,它甚至都不是公共制定者。

答案 2 :(得分:-1)

  

这是否意味着我将InstanceManager.Employee设置为null?

没有。您只是将“emp”,iself作为局部变量设置为null。

  

如果我调试此代码,我发现InstanceManager的员工静态变量不为null!为什么呢?

您需要为employee属性实现公共setter。您可以将该物业公之于众。

您还可以向实例管理器添加类似的内容:

           public static void ClearEmployee()
            {
                employee = null;
            }

因为它明确地引用了静态字段。

答案 3 :(得分:-1)

“emp”是Test类中Employee的新实例。它不涉及静态变量员工。因为,

    Employee emp = InstanceManager.GetEmployee();

将获取值并分配给emp。

结论:实例emp(Test类)和employee(InstanceManager类)都不同。