我想知道我是否可以this
在 C# lambda 中使用关键字,虽然实际上我知道我可以,但我想确保这不是一件坏事,或者以后会产生微妙的问题。
阅读了lambdas 变量范围的规则后,我可以看到:
在引用它的委托超出范围之前,不会对捕获的变量进行垃圾收集。
所以这让我假设对象实例 ( 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
从 lambda 中访问显然有效。我想检查的是:
- 这是否遵循与局部变量相同的变量范围规则,这意味着
this
引用将保留在内存中,直到不再使用 lambda?从我的小实验中可以看出,但如果有人能提供更多细节,我会很感兴趣。 - 这是可取的吗?我不想在以后陷入这种模式可能导致问题的情况。