谁能解释一下这段代码中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"));
}
}
所有这些都封装在基本 View 模型提供的 Set 方法中。
顺便说一句。在 .NET 4.5 中,您可以利用新的编译器服务来简化这一过程。 .NET 4.5 附带 CallerMemberNameAttribute它允许 INotifyPropertyChanged 的实现提供一个自动获取属性名称的实用函数,因此您不必传递引用该属性的 lambda 表达式。此外,这个新功能是在编译时评估的,因此您可以获得与仅传递一个字符串时相同的性能,只是您不需要在任何地方指定该字符串,因此您可以安全地进行重构。
此功能也由 MVVM Light 提供,您可以使用不同的 Set 重载来使用它。您的示例将如下所示:
Set(ref _helloWorld, value);
在 C# 6 中,您还可以使用新的 nameof operator : nameof(HelloWorld) 将在编译时被替换为 "HelloWorld"。
