我可以声明一个Action并在实例对象上传递一个方法,该方法修改该对象的内部状态,然后调用该方法并查看私有实例变量是否已更改。但是如果我创建Action,那么将对象引用的方法为null我在调用Action时没有得到空引用异常,但显然我会尝试访问该对象。
如果没有任何改变可以改变什么呢?
一个人为的例子,我创建了一个构建器对象,它有一个公共的无效BuildWall方法,它只增加了它构建的墙数(一个私有整数变量)。为什么在将构建器设置为null之后可以调用buildWallAction,或者如果对象不需要存在以调用操作,那么Action如何修改对象?
提前致谢:)
class Program
{
static void Main(string[] args)
{
Builder builder = new Builder("Jim");
Console.WriteLine(builder.ToString());
Action buildWallAction = builder.BuildWall;
builder = null; //no more builder to change via BuildWall()
//starts work
buildWallAction(); //these calls modify _wallsBuilt on the builder object
buildWallAction(); //but if we set it to null we can still call them just fine
Console.WriteLine(builder.GetBuildingStatus()); //we will only get an exception here if builder is null
Console.ReadKey();
}
}
public class Builder
{
private string _name;
private int _wallsBuilt;
public Builder(string name)
{
_name = name;
_wallsBuilt = 0;
}
public void BuildWall()
{
_wallsBuilt++;
}
public string GetBuildingStatus()
{
string msg = $"{_name} has built {_wallsBuilt} walls.";
return msg;
}
}
答案 0 :(得分:3)
您的builder
变量不是实例,它是对实例的引用。因此,将变量设置为null
,不会“擦除”实例,只会删除引用,因此您无法再访问它。
buildWallAction
变量是对实例的方法BuildWall
的引用。这与builder
变量没有直接关系。将builder
变量设置为null
不会对buildWallAction
变量执行任何操作。