我有以下代码:
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对象。)
答案 0 :(得分:8)
这一行之后:
Employee emp = InstanceManager.GetEmployee();
你的情况如下:
当你这样做时:
emp = null;
之后,您不会更改静态变量employee
。您只需将emp
设置为引用另一个(在这种情况下为null
)“位置”。更准确地说 - 你说它不是指向任何东西。静态employee
始终指向它所在的位置。这条线的效果可以这样显示:
答案 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类)都不同。