アクションを宣言し、そのオブジェクトの内部状態を変更するインスタンスオブジェクトにメソッドを渡してから、メソッドを呼び出してプライベートインスタンス変数が変更されたことを確認できます。しかし、私がアクションを作成すると、オブジェクトをヌルにすると、アクションの呼び出し時にヌル参照例外を取得しないメソッドへの参照がありますが、オブジェクトにアクセスしようとすると明らかにします。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;
}
}
アクションは 'builder'変数をクロージャーとして取得します - http://stackoverflow.com/questions/9591476/are-lambda-expressions-in-c-sharp-closuresを参照してください – stuartd