我想写一个类似于这个的方法:
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 thatC
does not take ownership ofb
.
这意味着您无法在此处完全实现您的目标。您所拥有的可能是不正确的,因为 a
和 b
将在返回新的 C
之前被立即处理。
您需要稍微重构此代码。要么更改 Make()
,使其接受类型为 B
的参数;调用者将对 B
和 C
的生命周期负责。或者编写一个新类来实现 IDisposable
并包装 A
、B
和 C
并公开 C
通过一个属性。
如果您拥有 C
类型,您可以考虑修改它以允许它有选择地取得 b
的所有权。这是 .NET 本身中相当常见的模式。参见,例如,XmlReaderSettings.CloseInput .
关于c# - 如何返回依赖于 using 语句链的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409360/