初始化与未初始化的委托。使用哪一个

initialized vs uninitialized delegates. Which one to use

在调用委托时,我遇到过两种不同但非常相似的方法,但我无法找到关于何时使用其中一种方法的任何论据。

对于这个问题,我展示了实现 INotifyPropertyChanged 的​​两种方式。

首先确保检查 PropertyChanged 是否为空:

class Foo_One : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propname)
    {
        if(PropertyChanged!=null)
            PropertyChanged(this, new PropertyChangedEventArgs(propname));
    }
}

第二种方法不用检查 PropertyChanged 是否为空,因为它确保它可以更新。

class Foo_Two : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged= delegate{};
    void OnPropertyChanged(string propname)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propname));
    }
}

这里我只是猜测...

如果 PropertyChanged 可以为空,它不会在内存中为它保留 space 直到使用,但是在 ViewModel 对象上使用 INotifyPropertyChanged 将始终初始化 PropertyChanged 并因此使 Foo_Two 在这种情况下更好的实现?

因此对于任何其他具有“可选用途”的委托,例如 .net UIElement class 中存在的众多事件处理程序之一,Foo_one 在这种情况下最好将其最小化内存占用?

我的猜测是否完整?

你的解释非常接近,除了一件事:这个技巧与内存消耗无关,因为 delegate{} 对象占用的 space 可以忽略不计。这也与 CPU 周期无关,因为执行一个空委托只需要很少的时间。

诀窍在于代码的可读性和可维护性,因为它将代码中单个位置的初始化换成了您使用委托的所有位置的 if(Xyz!=null) 条件。当您只有一个地方使用委托时,这种交易会得到回报;添加第二次使用可为您带来纯粹的节省。这就是为什么您的第二种方法是一个很好的实施选择。