我想知道是否可以在C# lambda内部使用
阅读变量范围lambda规则后,我可以看到:
这段代码可以正常运行并输出正确的结果,因此在lambda内部访问
this
关键字,虽然我确实知道可以,但我想确保这不是一个坏事或将来会产生微妙的问题。阅读变量范围lambda规则后,我可以看到:
所以我认为对象实例(捕获的变量在引用它的委托退出作用域之前不会被垃圾回收。
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";
}
}
这段代码可以正常运行并输出正确的结果,因此在lambda内部访问
this
是有效的。但我想要确认以下内容:
- 这是否遵循与本地变量相同的变量作用域规则,意味着
this
引用会一直保留在内存中,直到不再使用该lambda?从我的小实验来看,似乎是这样,但如果有人能提供更多细节,我会很感兴趣。 - 这种做法是否明智?我不希望以后出现这种模式会导致问题的情况。