2016-10-04 97 views
0

我正在实现一个接口,它定义了一个我不需要/想要的事件,但我想避免不知情的订阅者'活着'。空的添加/删除事件定义是否阻止引用?

我认为如果我明确定义事件,这应该就足够了,但编译器会在那里添加代码并阻止我的计划?

public event EventHandler CanExecuteChanged 
{ 
    add { } 
    remove { } 
} 

语境:我有问题MVVMLight RelayCommand,因为它使用WeakReference,显然我有太多的间接在我的代码和我失去的命令。所以我想实现我自己的CanAlwaysExecuteCommand,为此我不需要该事件。

+0

不太清楚你在问什么。如果您使用空添加和删除来定义事件,订阅和取消订阅将不会执行任何操作。 – Evk

回答

1

是的这应该工作。如果一个接口强制INotifyPropertyChanged并且一些实现是不可变的,我使用相同的技巧。

但我不知道,所以我测试了它使用这个类:

public class Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged 
    { 
     add { } 
     remove { } 
    } 
} 

相应的IL-代码为事件执行(由dotPeek所示)是:

.method public final hidebysig virtual newslot specialname instance void 
    add_PropertyChanged(
    class [System]System.ComponentModel.PropertyChangedEventHandler 'value' 
) cil managed 
{ 
    .maxstack 8 

    // [77 17 - 77 18] 
    IL_0000: nop   

    // [77 19 - 77 20] 
    IL_0001: ret   

} // end of method Foo::add_PropertyChanged 

.method public final hidebysig virtual newslot specialname instance void 
    remove_PropertyChanged(
    class [System]System.ComponentModel.PropertyChangedEventHandler 'value' 
) cil managed 
{ 
    .maxstack 8 

    // [78 20 - 78 21] 
    IL_0000: nop   

    // [78 22 - 78 23] 
    IL_0001: ret   

} // end of method Foo::remove_PropertyChanged 

.event [System]System.ComponentModel.PropertyChangedEventHandler PropertyChanged 
{ 
    .addon instance void ConsoleApplication1.Foo::add_PropertyChanged(class [System]System.ComponentModel.PropertyChangedEventHandler) 
    .removeon instance void ConsoleApplication1.Foo::remove_PropertyChanged(class [System]System.ComponentModel.PropertyChangedEventHandler) 
} // end of event Foo::PropertyChanged 
+0

不是IL专家,但我会将其视为'是'。感谢您付出的努力! – Benjol

相关问题