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;
    }
}

也许会有帮助。它被保存了,但编译器是在幕后完成的。好的,谢谢,一切都清楚,它在幕后部分-将删除这个问题。你可以一直读到奶牛回家,然后当你真正看到它时仍然会感到惊讶。