三个问题:
发布于 2010-08-15 14:10:05
这个答案只涉及你问题的.NET部分
在.NET/Java中应该手动处理什么样的变量?我知道,SqlConnection应该总是手动释放,或者在使用{}块中使用。是对的吗?应该处理的其他类型的变量是什么?
在.NET中,实现IDisposable的所有对象都应该显式地释放(或者在using块中使用)。
我在某个地方读到,必须手动处理非托管代码。是这样吗?什么是非托管代码?我如何知道变量是托管的还是非托管的?
你可能指的是非托管资源,因为代码不能被处理.所有使用非托管资源的类(未在托管堆上分配内存,win32句柄.)应该实现IDisposable,并且应该明确地进行处理,因为它们不是由垃圾收集器管理的。
最后,如何处理变量?我知道that ()方法并没有真正地释放变量。那么处置()是做什么的呢?我应该将它们设置为null()吗?垃圾收集器的工作逻辑是什么?
我不太明白你的问题..。如果不释放变量,则由垃圾收集器管理。当不再使用托管内存时,所有托管内存都会自动释放(也就是说,代码无法访问它,因为没有对它的引用)。IDisposable.Dispose方法仅适用于不受GC管理的资源。
编辑:作为附带说明,我想补充一点,IDisposable主要用于清理非托管资源,但也经常用于执行其他清理操作和保证状态或数据完整性。例如,IDbTransaction实现IDisposable,以便在提交事务之前发生异常时回滚事务:
using (var trx = connection.BeginTransaction())
{
    // Do some work in the transaction
    ...
    // Commit
    trx.Commit();
} // the transaction is implicitly rolled back when Dispose is called发布于 2010-08-15 14:11:49
在Java中,您“关闭”而不是"dispose“。
一些第三方Java库或框架的类需要手动处理/关闭/销毁。
发布于 2010-08-15 14:04:06
.NET
Dispose方法。using块只是一个try- C#块的C#糖,它在finally块中处理IDiposable,只要它不是null。因此,即使在try块中抛出异常,也会发生处理。Dispose方法可以执行编写Dispose方法的开发人员所放入的任何代码!通常,这涉及释放“非托管”资源,这些资源不是由运行时管理的,例如数据库连接、窗口句柄和文件句柄。请注意,GC管理堆,因此在引用变为不可访问的对象之前将引用设置为null不会有太大帮助。这是一个读得好。
https://stackoverflow.com/questions/3487667
复制相似问题