在内部匿名函数 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;
}
仅出于测试目的,我创建了一个 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;
}