- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑我们正在使用一些非托管资源。
最常见的方法是:
//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
的工作方式相同,除了它还允许您添加自己的 catch
和 finally
block ,而无需将其包装在额外的try
block 。
Python 有 context 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/
我正在创建一个使用 svg 作为::after 内容的标签。我希望通过使用绝对定位将 svg 移动到主要内容下方并将其设置为 bottom: 0,但是如果我也将 margin-bottom 设置为 -
我是一名优秀的程序员,十分优秀!