【问题标题】:Editing Resharper's INotifyPropertyChanged编辑 Resharper 的 INotifyPropertyChanged
【发布时间】:2015-09-16 04:58:29
【问题描述】:

当我有一个我声明实现然后INotifyPropertyChanged 接口的类时,ReSharper 将自动生成此实现:

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
  var handler = PropertyChanged;
  if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

我总是这样编辑:

public event PropertyChangedEventHandler PropertyChanged = delegate { };

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
   PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

我可以以某种方式编辑自动生成的代码吗? Resharper 的文档对此我不太清楚。

【问题讨论】:

  • 为什么删除线程安全如此重要? Copy > check > invike 是最佳实践。
  • 如果您使用的是 VS 2015,我可以理解想要更改为 C# 6 标准,但是这里描述的更改是一个糟糕的更改......
  • 有人可以向我解释一下更改此代码如何消除线程安全吗?我不明白为什么这是一个糟糕的选择。当您知道事件已定义并且从不为空时,为什么需要复制/检查/调用?不是好斗的;我真的不明白。

标签: wpf resharper inotifypropertychanged


【解决方案1】:

不,您不能编辑自动生成的代码,因为它需要在生成时处理多种可能性 - 例如C# 6 使用?. 运算符,它还需要在事件已经存在并且已经被初始化时进行处理。

如果您确实想使用没有局部变量和空检查的速记版本,那么您可以先创建事件,并在生成OnPropertyChanged 方法之前使用= () => { }; 对其进行初始化。但是,为了线程安全,最好保留本地 var + null 检查。

【讨论】:

  • 我不明白。我 am 创建事件并使用 = delegate {} 对其进行初始化 - 基本上是一样的。你能详细说明这不是线程安全的吗?
  • 不,你是对的。 delegate {} 版本是线程安全的。本地 var + null 检查的问题是确保有要调用的事件处理程序,如果直接使用该事件,则会出现线程安全问题。通过确保至少有一个带有空委托的事件处理程序,可以处理线程安全问题。
  • 我同意你的结论,但不同意你的前提。这就是定制。预计它不会处理所有可能性。要使用您的示例,如果我创建一个自定义的 propertyChanged 模板,那么我显然希望它使用我告诉它使用的确切语法。 ?. 是否添加到标准中并不重要。我没有告诉它使用它。如果以及何时我决定更新我的自定义或返回默认值,那么它可以使用?.。 @ScottSEA 不幸的是,如前所述,现在 Resharper 中 不是 一个选项。但是,我会将其作为功能请求提交。
猜你喜欢
  • 2012-05-05
  • 2011-09-27
  • 1970-01-01
  • 2014-06-16
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多