C#操作变量范围和空引用

时间:2016-12-14 11:21:19

标签: c# .net delegates

我可以声明一个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;
    }
}

1 个答案:

答案 0 :(得分:3)

您的builder变量不是实例,它是对实例的引用。因此,将变量设置为null,不会“擦除”实例,只会删除引用,因此您无法再访问它。

buildWallAction变量是对实例的方法BuildWall的引用。这与builder变量没有直接关系。将builder变量设置为null不会对buildWallAction变量执行任何操作。