集合中的Lambda运算符

本文关键字:运算符 Lambda 集合 | 更新日期: 2023-09-27 18:15:11

谁能解释一下lambda运算符在这段代码中的目的,它是做什么的?

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

集合中的Lambda运算符

这是为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"取代。