集合中的Lambda运算符
本文关键字:运算符 Lambda 集合 | 更新日期: 2023-09-27 18:15:11
谁能解释一下lambda运算符在这段代码中的目的,它是做什么的?
public string HelloWorld
{
get { return _helloWorld; }
set { Set(() => HelloWorld, ref _helloWorld, value); }
}
这是为INotifyPropertyChanged
实现提取成员名的常用模式。
通常,您会想要用一个属性名称已更改的PropertyChangedEventArgs
引发PropertyChanged
事件。问题是属性名是一个字符串。所以如果你重命名属性,你必须确保你也调整了所有的成员名字符串。
为了避免这种情况,人们经常实现一些方法,例如您的Set
,它接受一个表达式。然后,该方法使用表达式树提取属性的成员名。然后,它使用该名称来创建事件参数,并为您引发事件。
您的Set
可能相当于以下setter:
set
{
if (_helloWorld != value)
{
_helloWorld = value;
OnPropertyChanged(new PropertyChangedEventArgs(this, "HelloWorld"));
}
}
所有这些都封装在由基视图模型提供的Set
方法中。
顺便说一句。在。net 4.5中,你可以使用新的编译器服务来使这个过程更简单。net 4.5附带了CallerMemberNameAttribute
,它允许INotifyPropertyChanged
的实现提供一个实用函数来自动获取属性的名称,这样你就不必传递一个引用属性的lambda表达式。此外,这个新功能是在编译时计算的,因此您可以获得与仅传递字符串时相同的性能,只是您不需要在任何地方指定该字符串,因此可以避免重构。
此功能也由MVVM Light提供,您可以使用Set
的不同重载来使用它。您的示例看起来就像这样:
Set(ref _helloWorld, value);
在c# 6中,您还可以使用新的nameof
运算符:nameof(HelloWorld)
将在编译时被"HelloWorld"
取代。