【发布时间】:2014-02-11 03:00:23
【问题描述】:
假设我们正在使用一些非托管资源。
最常见的做法是:
//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 是否提供类似的功能?
【问题讨论】:
-
您可以在 Java 7 中的
AutoCloseables 上使用 try-with-resources 块:try (AutoCloseable resource = ...) { ... }。在 Java 中,析构函数不能用于此目的,因为它们可以在 GC 线程上的任意时间被调用。 -
Java 提供了终结器和类似于
using的东西。终结器在 Java 中和在 C# 中一样不可靠,它们的唯一用途是为了以防万一。 -
在块的末尾不调用析构函数。它在不确定的时间被调用,由 GC 决定。即使在 C++ 中,如果您这样做,也不会在块的末尾调用析构函数。您在堆上分配一个对象,它的生命周期不限于它的范围。另一方面,Dispose IS 在 using 块的末尾调用。
-
您假设析构函数将在块的末尾被调用。你检查过这个假设吗?
标签: c# destructor idisposable