在内部匿名函数 C# 中使用对象作为参数传递给函数

Using an object passed as a parameter to a function in an inner anonymous function C#

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

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

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

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

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

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确实是递增的。所以它似乎有效但是......我不确定。匿名函数以何种方式跟踪要修改的变量?也许在某些情况下我的实现不再有效?

编译器生成额外的 class...

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

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

...并用生成的 class:

的类似函数替换您的匿名函数
private static void SetBinding(Property p, MyData test)
{
    var a = new <>c__DisplayClass1_0();
    a.test = test;
    p.PropertyChanged += a.<SetBinding>b__0;
}