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

时间:2013-01-08 14:29:54

标签: c# design-patterns resharper 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; }
}

DataClass.cs:

public class DataClass
{
   public string LastProperty1Value { get; set; }
}

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;
   }
}

到目前为止一切顺利。

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

...
new Observer(monitoredClassInstance, dataClassInstance);
...

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

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

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

答案 1 :(得分:2)

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

 public void Setup(MonitoredClass monitoredClass, DataClass dataClass)
 {
    _monitoredClass = monitoredClass;
    _dataClass = dataClass;
    _monitoredClass.PropertyChanged+=MonitoredClassPropertyChanged;
 }

 private void MonitoredClassPropertyChanged(..)
 {
    _dataClass.LastProperty1Value = _monitoredClass.Property1;
 }
}

Observer o = new Observer();
o.Setup( foo, bar );

这不仅会阻止警告,还会让您更改以在观察者上实现其他方法,例如

 public void Close()
 {
    _monitoredClass.PropertyChanged-=MonitoredClassPropertyChanged;
 }

如果您想以明确的方式控制取消订阅。