我目前正在上固定不具有处置使用的良好的图案的C#代码库。

它是一个大的代码库,它是一个资源需求的代码库和它在低电平使用许多定制非托管C ++库。

我有Dispose模式的一个很好的了解。我花了一些时间了解我所相信的是在这个问题上的黄金标准的文章:的乔达菲的处置文章

在试图尽量减少重复代码,我们一直在考虑处置一些辅助类,所以我的问题:

如果一个基类实现一个标准的Dispose模式应该它允许共享其设置标志即标记为受保护的吗

要澄清我的意思是应该有仅是一个继承层次结构,其限定一个对象实例是否已被释放或应该有在继承梯子的每个步骤?

的私人布尔内的单个布尔状态

在MSDN和在上述链路的实施例在每个级别设置一个标志,但从来没有解释它背后的推理。我是在这个问题上犹豫不决,你有什么想法和原因是什么?

有帮助吗?

解决方案

我会说没有它不应该共享的标志。共享标志创建失败这更好的封装可以预防的机会。

例如,考虑在这里你有基类大部分在只读处理的财产的情况。支持字段仅在基类的Dispose(处置)方法设置为true。这意味着,如果基类调用Dispose(除非当然邪恶反射)设置在财产永远只能返回true。这允许基类提供某一合同。

现在考虑相反的,在那里有一个受保护的设定器。任何类现在可以任意设定弃置属性为true不设置任何东西。这为处置任何处置时返回true的机会。

我会选择第一个选项,因为它提供了最可强制执行的合同。

其他提示

我推荐具有与公共的吸气和被保护的设定器上的基类已释放属性。

在你有一个应该做的事情上课的时候已经布置不同,比如抛出异常的方法的情况下,我想创建的基础类,其读取基类的私人领域只保护吸气剂性能。这样,您就允许任何继承者知道,如果他能够执行操作。

然后,对于如果类已经被设置到其自己的处置方法(例如:避免释放资源两次)知道,我认为有一个私人标记是为了清楚和更好地维护

除了JaredPar的答案,我想补充一点,并不总是需要有是一个_disposed标志。很多时候,该对象的其他“资源相关”字段自然提供了一种方式来表示配置状态。

例如,待之前被丢弃将由到COM对象的引用来表示Shutdown需要外部COM对象等Dispose的有关部分将是:

if (_comObject != null)
{
    _comObject.Shutdown();
    _comObject = null;
}

此可以安全地不调用Shutdown不止一次多次运行,因为需要。试图Dispose后使用_comObject其他方法会得到一个NullReferenceException,或理想的方法将检查_comObject场扔ObjectDisposedException

我觉得这是更经常比真不 - 有频繁实施了IDisposable,我不记得曾经需要一个单独的_disposed场。引入一个会增加自由度(提高的方式的数量为我螺钉它)。

因此,这是不太可能派生类的有用即使它是一个安全的想法(它并非如JaredPar解释)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top