为什么 INotifyPropertyChanged 的 SetProperty() 方法需要一个 ref 参数?
Why does the SetProperty() method of INotifyPropertyChanged need a ref argument?
考虑到 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));
}
为什么 SetProperty
方法需要一个 ref 参数?除了 class 字段之外几乎没有其他任何东西被传递给该方法,所以它应该始终是引用类型?
注意:我问这个问题是因为我想将此方法用于通过 foreach
循环枚举的项目,这不适用于 ref
关键字。
目的是通过引用传递 字段 以及新值。
如果这不是 ref
参数,您将传递字段的 值 ...此时此语句:
storage = value;
...将毫无意义。这将更改 参数 的值,但根本不会修改 字段 。
这里有一个完整的例子来说明区别:
using System;
class Program
{
static string field;
static void Main()
{
field = "initial value";
Console.WriteLine($"Before Modify1: {field}");
Modify1(field, "new value for Modify1");
Console.WriteLine($"After Modify1: {field}");
Modify2(ref field, "new value for Modify2");
Console.WriteLine($"After Modify2: {field}");
}
static void Modify1(string storage, string value)
{
// This only changes the parameter
storage = value;
}
static void Modify2(ref string storage, string value)
{
// This changes the variable that's been passed by reference,
// e.g. a field
storage = value;
}
}
输出:
Before Modify1: initial value
After Modify1: initial value
After Modify2: new value for Modify2
如您所见,Modify1
(没有 ref
)根本没有修改字段,而 Modify2
做了。
考虑到 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));
}
为什么 SetProperty
方法需要一个 ref 参数?除了 class 字段之外几乎没有其他任何东西被传递给该方法,所以它应该始终是引用类型?
注意:我问这个问题是因为我想将此方法用于通过 foreach
循环枚举的项目,这不适用于 ref
关键字。
目的是通过引用传递 字段 以及新值。
如果这不是 ref
参数,您将传递字段的 值 ...此时此语句:
storage = value;
...将毫无意义。这将更改 参数 的值,但根本不会修改 字段 。
这里有一个完整的例子来说明区别:
using System;
class Program
{
static string field;
static void Main()
{
field = "initial value";
Console.WriteLine($"Before Modify1: {field}");
Modify1(field, "new value for Modify1");
Console.WriteLine($"After Modify1: {field}");
Modify2(ref field, "new value for Modify2");
Console.WriteLine($"After Modify2: {field}");
}
static void Modify1(string storage, string value)
{
// This only changes the parameter
storage = value;
}
static void Modify2(ref string storage, string value)
{
// This changes the variable that's been passed by reference,
// e.g. a field
storage = value;
}
}
输出:
Before Modify1: initial value
After Modify1: initial value
After Modify2: new value for Modify2
如您所见,Modify1
(没有 ref
)根本没有修改字段,而 Modify2
做了。