集合中的 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
operator:nameof(HelloWorld)
将在编译时被 "HelloWorld"
替换。
谁能解释一下这段代码中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
operator:nameof(HelloWorld)
将在编译时被 "HelloWorld"
替换。