Wpf 编辑重竖琴';s InotifyProperty已更改

Wpf 编辑重竖琴';s InotifyProperty已更改,wpf,resharper,inotifypropertychanged,Wpf,Resharper,Inotifypropertychanged,当我有一个我声明实现的类,然后INotifyPropertyChanged接口时,ReSharper将自动生成此实现: public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged(string propertyName) { var handler = PropertyChanged;

当我有一个我声明实现的类,然后
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的文档不太清楚。

不,您不能编辑自动生成的代码,因为它在生成时需要处理许多可能性,例如C#6使用
?。
操作符,并且它还需要处理事件已经存在并且已经初始化的情况


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

为什么删除线程安全性如此重要?Copy>check>invike是一种最佳实践。如果您使用VS 2015,我可以理解您想要更改为C#6标准,但是这里描述的更改是一个很糟糕的更改…有人可以向我解释更改此代码如何消除线程安全吗?我不明白为什么这是一个糟糕的选择。当您知道事件已定义且从不为空时,为什么需要复制/检查/调用?不好斗;我真的不明白,我不明白。我正在创建事件并用
=delegate{}
初始化它-基本上是一样的。你能详细说明一下这是如何不安全的吗?不,你是对的。
委托{}
版本是线程安全的。本地var+null检查的问题是确保有一个事件处理程序要调用,如果直接使用该事件,则会出现线程安全问题。通过确保至少有一个事件处理程序和空委托,线程安全问题得到了处理。我同意你的结论,但不同意你的前提。这就是定制;它不可能处理所有的可能性。举个例子,如果我创建了一个定制的propertyChanged模板,那么我显然希望它使用我告诉它要使用的确切语法。是否将
?。
添加到标准中并不重要。我没有告诉它使用它。如果我决定在何时更新自定义项或返回默认值,则它可以使用
?。
@不幸的是,正如前面所说,现在在Resharper中这不是一个选项。但是,我会将其作为功能请求提交。