gpt4 book ai didi

c# - 防止未分配对象的设计模式

转载 作者:太空狗 更新时间:2023-10-29 17:46:42 25 4
gpt4 key购买 nike

我经常收到一些关于“使用‘new’表达式创建的未分配对象”的 resharper 警告。以下代码片段应说明情况:

我正在使用一个辅助类 (Observer.cs),它监视来自其他类 (MonitoredClass.cs) 的一些属性。当属性发生变化时,观察者类将更改后的值写入另一个数据类 (DataClass.cs)。

简化的代码片段:

监控类.cs:

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

数据类.cs:

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

观察者.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' 表达式创建的可能未分配的对象”。

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

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

最佳答案

也许就这样就好了。当然,它之所以有效,是因为您附加了一个事件处理程序,从而将 Observer 的生命周期与 MonitoredClass 的生命周期联系起来。如果您没有附加事件处理程序,那么 Observer 将没有对它的引用,并且它(最终)将被垃圾收集。

考虑一下,将构造函数设为私有(private)并编写一个公共(public)静态工厂方法来创建它可能会更清楚:

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() 中抑制警告,调用它的人就不需要担心了。

关于c# - 防止未分配对象的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com