c# - 如何返回依赖于 using 语句链的对象?

标签 c# idisposable

我想写一个类似于这个的方法:

C Make()
{
    using (var a = new A())
    using (var b = new B(a))
    {
        return new C(b);
    }
}

这很糟糕,因为当方法返回时,c 保留对已处置对象的引用。

注意:

  • A 实现了 IDisposable
  • B 实现了 IDisposable
  • C 做 不实现 IDisposable 因为 C 的作者声明 C 不取得 b 的所有权。

最佳答案

这是说明文档很重要的地方的一个很好的例子。它构成了类契约的一部分。

当然,你已经意识到这一点,因为你说,

the author of C stated that C does not take ownership of b.

这意味着您无法在此处完全实现您的目标。您所拥有的可能是不正确的,因为 ab 将在返回新的 C 之前被立即处理。

您需要稍微重构此代码。要么更改 Make(),使其接受类型为 B 的参数;调用者将对 BC 的生命周期负责。或者编写一个新类来实现 IDisposable 并包装 ABC 并公开 C 通过一个属性。

如果您拥有 C 类型,您可以考虑修改它以允许它有选择地取得 b 的所有权。这是 .NET 本身中相当常见的模式。参见,例如,XmlReaderSettings.CloseInput .

关于c# - 如何返回依赖于 using 语句链的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409360/

相关文章:

c# - "using"语句中的灾难性故障,即 using(var a= new stream()) 和 a.Something() 抛出异常

c# - 引用 using() block 之外的对象

.net - 哪些 .NET Framework 类实现 IDisposable

c# - 异常处理中函数参数的一般记录

c# - 为什么 Array.BinarySearch() 给出负数?

c# - Html 到 pdf 缺少一些字符 (itextsharp)

c# - 在 GAC 中注册一个 dll

c# - 流式数据 BlockingCollection

c# - 在 C# 中使用 `using` 关键字避免多次处置的最佳实践

c# - 使用 ? 时出现 CA2213 警告。 (空条件运算符)调用 Dispose