在内部匿名函数C#

时间:2019-09-01 17:33:39

标签: c# events anonymous-function

仅出于测试目的,我创建了一个类 MyData ,其中包含一个名为Id的int属性。

public class MyData
{
    public int Id { get; set; }
}

然后,在App Console的Main函数中,我初始化该类的两个实例。

MyData myData = new MyData() { Id = 1 },
            myData2 = new MyData() { Id = 2 };

还有一个名为 Property 的新对象。这是一个简单的对象,它拥有一个值并在该值更改时触发一个事件。

Property p = new Property("Test",
            "System.String",
            "c");

所以我只需创建一个名为Test的新属性,其中保存一个类型为System.String的对象,并将其初始化为“ c”。

现在,我想设置一个绑定,例如,当属性值更改时,我想增加myDatas的ID。

所以我创建了这个静态函数:

private static void SetBinding(Property p,
    MyData test)
{
    p.PropertyChanged += ((o, r) => 
    {
        test.Id++;
    });
}

并将其调用到Main方法中:

SetBinding(p, myData);
SetBinding(p, myData2);

调试时,我看到ID实际增加了。看来可行,但是...我不确定。匿名函数以哪种方式跟踪要修改的变量?也许有一种情况我的实现不再起作用了?

1 个答案:

答案 0 :(得分:2)

编译器会生成一个附加类...

[CompilerGenerated]
private sealed class <>c__DisplayClass1_0
{
    public MyData test;

    internal void <SetBinding>b__0(object o, PropertyChangedEventArgs r)
    {
        test.Id++;
    }
}

...并将您的匿名函数替换为生成的类的类似函数:

private static void SetBinding(Property p, MyData test)
{
    var a = new <>c__DisplayClass1_0();
    a.test = test;
    p.PropertyChanged += a.<SetBinding>b__0;
}