空的添加/删除事件定义是否阻止引用

本文关键字:是否 引用 定义 事件 添加 删除 | 更新日期: 2023-09-27 18:11:20

我正在实现一个接口,它定义了一个我不需要/不想要的事件,但我想避免让不知情的订阅者"活着"。

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

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

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

空的添加/删除事件定义是否阻止引用

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

但是我不确定,所以我使用这个类进行测试:

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

事件实现的对应IL-Code(由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