Har*_*non 4 .net c# java garbage-collection dispose
三个问题:
应该在.NET/Java中手动处理哪些变量?我知道SqlConnection应始终手动处理或在using {}块中使用.这样对吗?应该处理的其他变量是什么?
我在某地读过必须手动处理非托管代码.是对的吗?究竟什么是非托管代码?如何知道变量是托管还是非托管?
最后,我如何处置变量?我知道Dispose()方法并没有真正处理变量.那么Dispose()做什么呢?我应该将它们设置为null()吗?垃圾收集器的工作原理是什么?
此答案仅涉及问题的.NET部分
应该在.NET/Java中手动处理哪些变量?我知道SqlConnection应始终手动处理或在using {}块中使用.这样对吗?应该处理的其他变量是什么?
在.NET中,所有实现的对象都IDisposable应该显式处理(或在using块中使用).
我在某地读过必须手动处理非托管代码.是对的吗?究竟什么是托管代码,我如何知道如果一个变量被托管或非托管?
你可能意味着非托管资源,因为代码不能被布置......使用非托管资源(内存不分配在托管堆中,win32的处理...)应该实现所有类IDisposable,并应显式地布置,因为它们不是由垃圾收集器管理.
最后,我如何处置变量?我知道Dispose()方法并没有真正处理变量.那么Dispose()做什么呢?我应该将它们设置为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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1738 次 |
| 最近记录: |