gpt4 book ai didi

c# - 为什么析构函数不足以实现 IDisposable?

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:17 27 4
gpt4 key购买 nike

考虑我们正在使用一些非托管资源。

最常见的方法是:

//With IDisposable
using (MemoryStream memoryStream = new MemoryStream())
{
//Operate with memory stream
}

但是我们不能写下面的吗?

//With destructor called at the end of a block
{
MemoryStream memoryStream = new MemoryStream();
//Operate with memory stream
}
  • IDisposable 的主要目标是什么?

  • 它只是终结逻辑分离的设计模式吗?

  • 例如,Java 是否提供类似的东西?

最佳答案

  • What is the main goal of IDisposable?

  • Is it only a design pattern for finalization logic separation?

它的目标只是成为调用该逻辑的标准接口(interface)。 recommended implementation将手动处置 (Dispose(true)) 与从终结器调用的 Dispose (Dispose(false)) 分开只是为了提高效率——从终结器内部处置内部字段是多余的因为,由于不能手动调用终结器,我们知道此时它们一定已经被收集了。

需要手动处理,因为垃圾收集不是立即进行的(而且您不能单独强制收集单个对象)。这不仅仅是一个效率问题,因为非托管资源可能不支持多次访问,因此如果第一个尚未收集,则稍后访问它的另一个对象将失败。甚至不能保证收藏,因为 Ricibob显示,将代码放在显式范围内并不会阻止外部对象获取自己的引用。

  • And does, for example, Java, provide something similar?

using 只是一个自动实现的“try ... finally” block ,调用预定义的方法。

Java 将此功能包含为 extension of the try statement itself .这与 using 的工作方式相同,除了它还允许您添加自己的 catchfinally block ,而无需将其包装在额外的try block 。

Pythoncontext managers这是一个更灵活的版本。上下文管理器可以定义特定的异常处理以及 finally,并且可以返回与传入的对象不同的对象——也就是说,这是可能的:

with CustomDisposer(MemoryStream()) as memoryStream:

CustomDisposer 对象负责 dispose 实现,但它返回 MemoryStream 作为分配给 memoryStream 变量的资源.

Ruby 有一个 yield 语句,它允许一个函数 wrap a code block并可选地为 block 提供一个参数,因此您可以通过将给定对象传递给 block 然后在 ensure 中调用 dispose 来实现此目的(finally 等效):

def using(o)
yield o
ensure
o.dispose
end

using MemoryStream.new do |memoryStream|
#Operate with memory stream
end

当然,由于这是函数定义的一部分,因此不需要专用的using 函数——它可以直接在MemoryStream.Open 中实现方法举例。

关于c# - 为什么析构函数不足以实现 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21259454/

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