【问题标题】:Using an object passed as a parameter to a function in an inner anonymous function C#使用作为参数传递给内部匿名函数C#中的函数的对象
【发布时间】:2019-09-01 17:33:39
【问题描述】:

仅出于测试目的,我创建了一个类 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 的新属性,其中包含一个初始化为“c”的 System.String 类型的对象。

现在,我想设置一个绑定,例如当 Property 的值发生变化时,我想增加 myDatas 的 Id。

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

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

并将其调用到 Main 方法中:

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

调试,我看到ID实际上是递增的。所以它似乎有效,但是......我不确定。匿名函数以何种方式跟踪要修改的变量?也许在某种情况下,我的实现不再起作用了?

【问题讨论】:

  • Thisthis 可能会回答您的问题,但我不会将其称为与其中任何一个完全相同的副本。
  • 如果您真的想了解发生了什么,您应该在 ILSpy(或类似工具)中打开此程序集并查看代码是如何翻译的。您将看到上面链接中解释的详细信息。

标签: c# events anonymous-function


【解决方案1】:

编译器生成一个额外的类...

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

【讨论】:

  • 非常感谢先生。 Jann Westermann ... 另一个问题,请... CompilerGenerated 类何时可用于 GarbageCollector?我想当我从 PropertyChanged 事件中删除所有代表时。我错了吗?
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多