空 add/remove 事件定义是否会阻止引用?
Does empty add/remove event definition prevent references?
我正在实现一个接口,该接口定义了一个我没有 need/want 的事件,但我想避免保留不知情的订阅者 'alive'。
我认为如果我显式定义事件,这就足够了,但是编译器会在其中添加代码并阻碍我的计划吗?
public event EventHandler CanExecuteChanged
{
add { }
remove { }
}
上下文:我在使用 MVVMLight RelayCommand
时遇到了问题,因为它使用了 WeakReference
,显然我的代码中有太多的间接访问,而且我正在丢失命令。所以我想实现我自己的 CanAlwaysExecuteCommand,我不需要事件。
是的,这应该有效。如果接口强制 INotifyPropertyChanged 并且某些实现是不可变的,我会使用相同的技巧。
但我不确定所以我用这个 class:
测试了它
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
我正在实现一个接口,该接口定义了一个我没有 need/want 的事件,但我想避免保留不知情的订阅者 'alive'。
我认为如果我显式定义事件,这就足够了,但是编译器会在其中添加代码并阻碍我的计划吗?
public event EventHandler CanExecuteChanged
{
add { }
remove { }
}
上下文:我在使用 MVVMLight RelayCommand
时遇到了问题,因为它使用了 WeakReference
,显然我的代码中有太多的间接访问,而且我正在丢失命令。所以我想实现我自己的 CanAlwaysExecuteCommand,我不需要事件。
是的,这应该有效。如果接口强制 INotifyPropertyChanged 并且某些实现是不可变的,我会使用相同的技巧。
但我不确定所以我用这个 class:
测试了它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