【问题标题】:Are disposable fields of disposable classes disposed of automatically一次性类的一次性字段是否自动处理
【发布时间】:2017-07-05 08:25:05
【问题描述】:

我的问题很简单:如果实现IDisposable 的类具有也是一次性的字段,那么处置实例是否也会处置字段值?

示例:

假设我有一个类OuterDisposable,其中有一个字段innerDisposable,其类型是另一个一次性类:

public class OuterDisposable : IDisposable
{
    private InnerDisposable innerDisposable;
}

我打算将 OuterDisposable 的所有实例包装在 using 语句中,以便自动安全地处理它们:

using (var outerDisposable = new OuterDisposable())
{
    // Stuff
}

但是,我不确定一旦到达using 的末尾,innerDisposable 会发生什么。正确处理它非常重要,因此我需要确定行为将是什么。

我认为明确处理 innerDisposable 将达到我想要的结果:

public void Dispose()
{
    this.innerDisposable.Dispose();
}

但这有必要吗?如果外部using 语句负责处理innerDisposable 以及outerDisposable,那么它是多余的。

那么,这些一次性字段是如何处理的呢?

【问题讨论】:

  • 不,OuterDisposable.Dispose 方法必须处理它,using 只是确保调用了Dispose
  • 包装IDisposable 类的using 只调用DisposeIDisposable 函数,它不会检查对象的IDisposable 属性,因此您的假设是正确的
  • 您可以通过在inner的dispose方法中放置某种调试语句来轻松检查自己的行为。

标签: c#


【解决方案1】:

IDisposable 是一个接口和一个模式。除了 usingforeach 的明确支持之外,它并不是 C# 语言的真正组成部分。什么都不会“自动”发生。

反之,考虑一下,如果这种处置确实是自动发生的。并进一步考虑,一个类持有对某种可能是一次性的共享资源的引用是完全有效的。您必须发明新的语法,然后才能“选择退出”您正在寻找的这种自动处置。

C# 是一种更简单的语言,因为它没有这样的功能。当您(程序员)知道它们不再被使用时,清理IDisposable 对象始终是您的责任。通常,对于像这里这样的类,这将是您自己的 Dispose 方法被调用的时候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多