2016-12-14 12 views
0

アクションを宣言し、そのオブジェクトの内部状態を変更するインスタンスオブジェクトにメソッドを渡してから、メソッドを呼び出してプライベートインスタンス変数が変更されたことを確認できます。しかし、私がアクションを作成すると、オブジェクトをヌルにすると、アクションの呼び出し時にヌル参照例外を取得しないメソッドへの参照がありますが、オブジェクトにアクセスしようとすると明らかにします。C#アクション変数スコープとNULL参照

何も変更する必要がない場合、どのように変更することができますか?

私がビルドした壁の数を増やすパブリックvoid BuildWallメソッド(プライベート整数変数)を持つビルダーオブジェクトを作成した、実例です。ビルダーをnullに設定した後にbuildWallActionを呼び出すのはなぜですか?また、アクションを呼び出すためにオブジェクトが存在していなければ、オブジェクトを変更するアクションはどのようになっていますか?事前に

感謝:)

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

アクションは 'builder'変数をクロージャーとして取得します - http://stackoverflow.com/questions/9591476/are-lambda-expressions-in-c-sharp-closuresを参照してください – stuartd

答えて

3

あなたbuilder変数がインスタンスではありませんが、それはインスタンス参照です。したがって、変数をnullに設定すると、インスタンスは消去されません。参照を取り除くだけでアクセスできなくなります。

buildWallAction変数は、インスタンスのBuildWallへの参照です。これは、変数builderに直接関係するものではありません。 builder変数をnullに設定しても、buildWallAction変数には何も行われません。

+0

Ah!もちろん:)ありがとうMaarten! – JackySlims