委托是指向函数的指针?并且还可以保存变量

本文关键字:还可以 变量 保存 指针 函数 | 更新日期: 2023-09-27 18:34:55

据我理解代表的概念,他们只是指向一种方法。然后,当我感到幸运时,我可以出去调用我的代表所指的方法,对吧?

给定的代码如下:

class Program
{
    static void Main(string[] args)
    {
        Func<MyClass> myAct = GetAct();
        Method(myAct);
    }
    private static Func<MyClass> GetAct()
    {
        MyClass obj = new MyClass()
        {
            Prop1 = 5
        };
        Func<MyClass> myAct = new Func<MyClass>(
            () =>
            {
                MyClass obj2 = new MyClass();
                MyClass2 obj3 = new MyClass2()
                {
                    Prop3 = 25,
                    Prop4 = "test"
                };
                obj2.Prop2 = ((obj.Prop1 + 5) * obj3.Prop3)
                    .ToString() + obj3.Prop4;
                return obj2;
            });
        return myAct;
    }
    static void Method(Delegate func)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        var result = func.DynamicInvoke();
    }
}
class MyClass
{
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
}
class MyClass2
{
    public int Prop3 { get; set; }
    public string Prop4 { get; set; }
}

现在我的委托myAct(在本例中为 Func<MyClass>(指向一个匿名函数,该函数执行一些简单的变量分配。到目前为止没什么特别的。

我们调用委托。

一切都很顺利,正如我们预期的那样。但问题是为什么?如果委托只是简单地指向匿名方法并完成了垃圾回收,则 CLR 如何知道obj及其值是什么?调用函数时,对obj的引用存储在哪里可用?在代表内部?

委托是指向函数的指针?并且还可以保存变量

匿名

方法是在GetAct()范围内定义的,因此 CLR 使作用域变量可用于匿名方法。

它类似于成员方法可以使用实例变量的方式。

此外,请查看使用闭包的陷阱:http://msmvps.com/blogs/peterritchie/archive/2010/11/03/deep-dive-on-closure-pitfals.aspx