Design-用于防止未分配对象的模式

rhe*_*980 9 c# resharper design-patterns instantiation

我经常会收到一些关于"使用'new'表达式创建的未分配对象"的resharper警告.以下代码剪断将演示以下情况:

我正在使用一个帮助器类(Observer.cs)来监视来自另一个类(MonitoredClass.cs)的一些属性.当属性更改时,观察者类将更改的值写入另一个数据类(DataClass.cs).

剪切的简化代码:

MonitoredClass.cs:

public class MonitoredClass : INotifyPropertyChanged
{
   // simplified: in fact property calls OnPropertyChange(..)
   public string Property1 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

DataClass.cs:

public class DataClass
{
   public string LastProperty1Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Observer.cs:

public class Observer
{
   private MonitoredClass _monitoredClass;
   private DataClass _dataClass;
   public Observer(MonitoredClass monitoredClass, DataClass dataClass)
   {
      _monitoredClass = monitoredClass;
      _dataClass = dataClass;
      _monitoredClass.PropertyChanged+=MonitoredClassPropertyChanged;
   }

   private void MonitoredClassPropertyChanged(..)
   {
      _dataClass.LastProperty1Value = _monitoredClass.Property1;
   }
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

如果我现在使用上面的Observer类,如下所示:

...
new Observer(monitoredClassInstance, dataClassInstance);
...
Run Code Online (Sandbox Code Playgroud)

比我得到一个resharper警告"可能由'new'表达式创建的未分配对象".

我现在的问题是,如果有更好的解决方案/模式来设计这个观察者.粗略的,我可以将新的观察者实例分配给私有字段.但是我有一个从未使用过的领域.或者我可以使用属性设置monitoredClassInstance和dataClassInstance,而不是在构造函数中传递它们.但这只能阻止警告,但实际上并没有改变架构.

提前感谢您的建议,意见,模式等.

Mat*_*son 9

它可能很好.当然,它只能起作用,因为你附加了一个事件处理程序,从而将Observer的生命周期与MonitoredClass的生命周期联系起来.如果你没有附加一个事件处理程序,那么Observer将没有对它的引用,并且它(最终)将被垃圾收集.

考虑到它,因此可能更清楚的是使构造函数私有并编写一个公共静态工厂方法来创建它:

public class Observer
{
    private MonitoredClass _monitoredClass;
    private DataClass _dataClass;

    public static void Observe(MonitoredClass monitoredClass, DataClass dataClass)
    {
        new Observer(monitoredClass, dataClass);
    }

    private Observer(MonitoredClass monitoredClass, DataClass dataClass)
    {
        _monitoredClass = monitoredClass;
        _dataClass = dataClass;
        _monitoredClass.PropertyChanged+=MonitoredClassPropertyChanged;
    }

    private void MonitoredClassPropertyChanged(..)
    {
        _dataClass.LastProperty1Value = _monitoredClass.Property1;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以抑制Observe()中的警告,并且调用它的人不需要担心它.