C# 学员如何记住它';s参数?
考虑以下代码:C# 学员如何记住它';s参数?,c#,parameters,delegates,C#,Parameters,Delegates,考虑以下代码: public ModelView(Model model) : this() { Loaded += (object sender, RoutedEventArgs e) => { DataContext = model; }; } 当加载的事件再次运行时,参数model出现在内存中,但它从未被显式保存,是吗?当您创建匿名方法或lambda时,编译器会在幕后创建一个新类,具有一些内部名称,如ctor_0或类似名称。这个类有一个方法,
public ModelView(Model model) : this()
{
Loaded += (object sender, RoutedEventArgs e) =>
{
DataContext = model;
};
}
当加载的
事件再次运行时,参数model
出现在内存中,但它从未被显式保存,是吗?当您创建匿名方法或lambda时,编译器会在幕后创建一个新类,具有一些内部名称,如ctor_0
或类似名称。这个类有一个方法,它是lambda的内容,但它也有一些属性,用于捕获定义lambda的函数的本地状态,并使其可供lambda使用
请参阅MSDN文档中Lambda表达式中的变量范围部分:
以下规则适用于lambda表达式中的变量范围:
- 在引用该变量的委托有资格进行垃圾收集之前,不会对捕获的变量进行垃圾收集。
lambda表达式中引入的变量在外部方法中不可见
- lambda表达式无法直接从封闭方法捕获ref或out参数
- lambda表达式中的return语句不会导致封闭方法返回
- 如果跳转语句的目标位于块外部,lambda表达式不能包含lambda函数内部的goto语句、break语句或continue语句。如果目标位于lambda函数块内,则在lambda函数块外使用跳转语句也是错误的
除了@Avner的答案,这是C#编译器(排序)在封面下为您生成的:
public ModelView(Model model) : this()
{
var closure = new AnonymousClass { _this = this, model = model };
Loaded += closure.Loaded;
}
private class AnonymousClass
{
public ModelView _this;
public Model model;
public void Loaded(object sender, RoutedEventArgs e)
{
_this.DataContext = model;
}
}
也许会有帮助。它被保存了,但编译器是在幕后完成的。好的,谢谢,一切都清楚,它在幕后部分-将删除这个问题。你可以一直读到奶牛回家,然后当你真正看到它时仍然会感到惊讶。