2016-10-04 93 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

相關問題