集合中的 Lambda 运算符

Lambda operator in set

谁能解释一下这段代码中lambda运算符的用途是什么,它有什么作用?

public string HelloWorld
{
    get { return _helloWorld; }
    set { Set(() => HelloWorld, ref _helloWorld, value); }
}

这是为 INotifyPropertyChanged 实现提取成员名称的常用模式。

通常,您会希望引发 PropertyChanged 事件,其中 PropertyChangedEventArgs 的 属性 名称已更改。问题是 属性 名称是一个字符串。因此,如果您重命名 属性,则必须确保也调整了所有成员名称字符串。

为了避免这种情况,人们经常实施一些方法,例如你的 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 operatornameof(HelloWorld) 将在编译时被 "HelloWorld" 替换。