【问题标题】:What is the proper way to wire up event notifications for IPropertyChanged?为 PropertyChanged 连接事件通知的正确方法是什么?
【发布时间】:2011-04-04 06:30:37
【问题描述】:

这两种方法中哪一种是为 IPropertyChangedNotification 接口连接更改通知的正确方法?

someObj.PropertyChanged += new PropertyChangedEventHandler(SomeObjPropChanged);
someObj.PropertyChanged += SomeObjPropChanged;

这两种方法似乎都有效,但我不太清楚区别。一个只是另一个的捷径,还是有可能与内存管理和无意中保留一些东西有关? (我了解到,由于对象无意中被扎根,连接更改通知和事件处理程序存在导致潜在内存泄漏的问题。)

那么有没有人接受?

M

【问题讨论】:

    标签: c# memory-management memory-leaks inotifypropertychanged


    【解决方案1】:

    我想你会发现它们会产生相同的 IL。

    更新:

    PropertyChanged += new PropertyChangedEventHandler(SomeEventHandler);
    PropertyChanged += SomeEventHandler;
    

    使用 ildasm 在 IL 中的结果:

        IL_0006:  l4zyOP
        IL_0007:  nop
    //000011:           PropertyChanged += new PropertyChangedEventHandler(SomeEventHandler);
        IL_0008:  ldarg.0
        IL_0009:  ldarg.0
        IL_000a:  ldftn      instance void StackOverflow_5535253.SomeClass::SomeEventHandler(object, class [System]System.ComponentModel.PropertyChangedEventArgs)
        IL_0010:  newobj     instance void [System]System.ComponentModel.PropertyChangedEventHandler::.ctor(object, native int)
        IL_0015:  call       instance void StackOverflow_5535253.SomeClass::add_PropertyChanged(class [System]System.ComponentModel.PropertyChangedEventHandler)
        IL_001a:  nop
    //000012:           PropertyChanged += SomeEventHandler;
        IL_001b:  ldarg.0
        IL_001c:  ldarg.0
        IL_001d:  ldftn      instance void StackOverflow_5535253.SomeClass::SomeEventHandler(object, class [System]System.ComponentModel.PropertyChangedEventArgs)
        IL_0023:  newobj     instance void [System]System.ComponentModel.PropertyChangedEventHandler::.ctor(object, native int)
        IL_0028:  call       instance void StackOverflow_5535253.SomeClass::add_PropertyChanged(class [System]System.ComponentModel.PropertyChangedEventHandler)
        IL_002d:  nop
    

    【讨论】:

    • 您自己验证了吗?如果是这样,我很乐意看到一个例子。如果您发布了一个并且这就是它所显示的内容,那么您就会得到答案。
    【解决方案2】:

    绝对没有区别。

    【讨论】:

    • 那里的字体很大! :)
    • 去过! :) 我会像其他人一样向你提出同样的问题......你有没有提到这个事实,或者你能提供一些显示这一点的示例 IL? (我从来没有亲自玩过 IL,所以我不知道如何检查自己。)
    • @MarquelV,下载 LINQPad。它向您展示了从 C# 语句/程序/表达式生成的 IL
    • 为 LINQpad 参考提供了 +1。仍在努力让它发挥作用,请注意,但是嘿......如果可以的话,你也会得到答案。 (另外,从技术上讲,你确实先回答了。)
    【解决方案3】:

    someObj.PropertyChanged += SomeObjPropChanged 只是一个快捷方式,由 C# 编译器扩展为 someObj.PropertyChanged += new PropertyChangedEventHandler(SomeObjPropChanged)。我更喜欢第一种方式,因为它看起来更清晰。

    【讨论】:

    • 这就是我的想法,但我正在寻找一些特殊的东西......例如文档或 IL。
    猜你喜欢
    • 2012-02-13
    • 2014-05-08
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2016-06-28
    • 2013-11-09
    相关资源
    最近更新 更多