C#ラムダ内でキーワードを使用できるかどうか疑問に思っていますがthis
、実際には使用できることはわかっていますが、これが悪いことではないか、後で微妙な問題が発生することを確認したいと思います。
ラムダの変数スコープに関するルールを読んだら、次のことがわかります。
キャプチャされた変数は、それを参照するデリゲートがスコープ外になるまでガベージコレクションされません。
したがって、これにより、オブジェクトインスタンス(this
)もキャプチャされると想定します。これをテストするために、私は実際のコードでおおよそ目指したいこの不自然な例を書きました-LINQPadで書かれているので、なぜDump()
メソッド呼び出しがあるのですか?
void Main()
{
Repository repo = new Repository();
Person person = repo.GetPerson(1);
person.ID.Dump("Person ID - Value Assigned");
person.Name.Dump("Person Name - Lazily Created");
}
class Person
{
public Person(Lazy<string> name)
{
this.name = name;
}
public int ID { get; set; }
private Lazy<string> name;
public string Name
{
get { return name.Value; }
}
}
class Repository
{
public Person GetPerson(int id)
{
// Setup person to lazily load a name value
Person person = new Person(
new Lazy<string>(
() => this.GetName() // <--- This I'm not sure on...
)
);
person.ID = id;
return person;
}
public string GetName()
{
return "John Smith";
}
}
これが実行され、正しい出力が得られるため、ラムダ内からのアクセスthis
は明らかに機能します。私がチェックしたいのは:
- これはローカル変数と同じ変数スコープルールに従いますか?つまり
this
、ラムダが使用されなくなるまで参照はメモリに保持されますか?私の小さな実験からはそう見えるでしょうが、誰かがさらに詳細を教えてくれるなら、私は興味があります。 - これはお勧めですか?このパターンが問題を引き起こす可能性がある状況に後で入りたくありません。