Skip to main content
 首页 » 编程设计

c#之集合中的 Lambda 运算符

2024年01月31日23sky-heaven

谁能解释一下这段代码中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"。