当调用委托时,我遇到了两种不同但非常相似的方法,但是我无法找到何时使用另一种委托的论据。
这个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会在这种情况下更好地减少内存使用吗?
我的猜测是完全的吗?
答案 0 :(得分:2)
你的解释非常接近,除了一件事:这个技巧与内存消耗无关,因为delegate{}
个对象占用的空间可以忽略不计。它也不是关于CPU周期,因为执行空委托只需要很少的时间。
技巧是关于代码的可读性和可维护性,因为它在代码中的单个位置进行初始化,以便在您使用委托的所有地方进行if(Xyz!=null)
条件。当只有一个地方使用代表时,这笔交易会得到回报;添加第二次使用可为您带来纯粹的节省。这就是为什么你的第二种方法是一个很好的实现选择。