如果我执行conn.Dispose()方法(其中conn是SqlConnection类的一个实例),那么它会清除堆中的conn对象吗?
不行。请参见msdn。 对象仍然存在,直到所有引用都消失。 以下是一个小例子:
myObject = new Something();
myObject.Dispose()
myObject.Foo() // still perfectly valid (but pretty ugly)
myObject = null; // now the reference, while still living, could be collected.
GC.Collect(); // now it is quite sure gone. (never call it unless you have good reasons)
Dispose()
可以确定性地关闭昂贵的资源(在本例中为网络连接)。来自 MSDN:IDisposable.Dispose
使用此方法关闭或释放由实现此接口的类的实例持有的未托管资源,例如文件、流和句柄。
因此,Dispose 是关于垃圾回收器视图之外的底层资源。Dispose 不是关于实例本身。
不。
IDisposable 为“处理”对象提供了一个众所周知的接口。处理通常是为了显式释放资源,否则这些资源将一直保留,直到对象超出范围并被垃圾回收,即当对象从内存中移除时(几乎总是堆内存)。
略微偏题,您还应该知道 using
关键字与 IDisposable
一起使用。
using (var disposableObject = new DisposableObject())
{
..do stuff with disposableObject..
} //disposableObject.Dispose() implicitly called here.
using (SqlConnection myConn = new .....)
时,实际上是调用Dispose方法。 - ken2k