初始化委托与未初始化委托.用哪一个
本文关键字:初始化 哪一个 | 更新日期: 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)
条件。当您使用委托的地点只有一个时,这种交易就会得到回报;添加二次使用为您带来了纯粹的节省。这就是为什么第二种方法是一个很好的实现选择。