为PropertyChanged连接事件通知的正确方法是什么?

时间:2011-04-04 06:30:38

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

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

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

这两个似乎都有效,但我并不清楚它们之间的区别。一个只是另一个的捷径,或者它是否可能与内存管理和无意中保持一致? (我已经读过,由于对象无意中被植根,导致更改通知和事件处理程序连接导致潜在的内存泄漏存在问题。)

所以任何人?

中号

3 个答案:

答案 0 :(得分:3)

我认为你会发现他们会产生相同的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

答案 1 :(得分:3)

绝对没有区别。

答案 2 :(得分:0)

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