初始化委托与未初始化委托.用哪一个

本文关键字:初始化 哪一个 | 更新日期: 2023-09-27 18:05:51

当调用委托时,我遇到了两种不同但非常相似的方法,但我无法找到任何关于何时使用其中一种而不是另一种的参数。

将显示INotifyPropertyChanged的两种实现方式。

The First确保检查PropertyChanged是否为null:

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可以是空的,它不会在内存中保留空间,直到使用,但是与INotifyPropertyChanged上使用的ViewModel对象将始终初始化PropertyChanged,因此使Foo_Two在这种情况下更好的实现?

所以对于任何其他具有"optional use"比如。net ui元素类中存在的许多event处理程序之一,Foo_one在这种情况下会更好地减少内存使用?

我的猜测完全正确吗?

初始化委托与未初始化委托.用哪一个

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

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