初始化与未初始化的代表。哪一个使用

时间:2015-08-02 10:28:36

标签: c# wpf delegates

当调用委托时,我遇到了两种不同但非常相似的方法,但是我无法找到何时使用另一种委托的论据。

这个ill show显示了实现INotifyPropertyChanged的方法。

First确保检查PropertyChanged是否为null:

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

第二种方法不打扰检查PropertyChanged是否为null因为它确保它更新。

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

我猜这里......

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

所以任何其他代表都有"可选用"比如.net UIElement类中存在的众多eventHandler之一,Foo_one会在这种情况下更好地减少内存使用吗?

我的猜测是完全的吗?

1 个答案:

答案 0 :(得分:2)

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

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