【发布时间】:2019-05-14 16:38:55
【问题描述】:
考虑到 INotifyPropertyChanged 的实现通常如下所示:
public class Observable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void SetProperty<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
为什么SetPropertymethod 需要一个 ref 参数?除了类字段之外几乎没有任何机会传递给方法,所以它应该始终是引用类型?
注意:我问这个问题是因为我想将此方法用于通过 foreach 循环枚举的项目,该循环不适用于 ref 关键字。
【问题讨论】:
-
阅读ref 关键字的文档。它会告诉你它的确切作用......
-
谢谢,虽然我知道 ref 关键字的作用,但我的问题是为什么在这种特殊情况下需要它。
-
如果您知道 ref 关键字的作用,那么您也知道 SetProperty 的作用(即为什么 SetProperty 使用 ref 关键字)。为什么需要问? o.O?
-
SetProperty对storage所做的唯一事情是设置storage = value。如果storage没有通过引用传递,那行代码将什么都不做。 If 会在方法内本地更新该变量,但这并不重要,因为在那之后该变量就不再使用了。 -
它将是一个引用,按值传递。这与通过引用传递的变量不同。有关详细信息,请参阅jonskeet.uk/csharp/parameters.html。
标签: c# inotifypropertychanged ref