首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >必须处理的变量类型是什么?(.NET/Java)

必须处理的变量类型是什么?(.NET/Java)
EN

Stack Overflow用户
提问于 2010-08-15 14:03:09
回答 8查看 2K关注 0票数 4

三个问题:

  1. 在.NET/Java中应该手动处理什么样的变量?我知道,SqlConnection应该总是手动释放,或者在使用{}块中使用。是对的吗?应该处理的其他类型的变量是什么?
  2. 我在某个地方读到,必须手动处理非托管代码。是那么回事吗?什么是非托管代码?我如何知道变量是托管的还是非托管的?
  3. 最后,如何处理变量?我知道that ()方法并没有真正地释放变量。那么处置()是做什么的呢?我应该将它们设置为null()吗?垃圾收集器的工作逻辑是什么?
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-08-15 14:10:05

这个答案只涉及你问题的.NET部分

在.NET/Java中应该手动处理什么样的变量?我知道,SqlConnection应该总是手动释放,或者在使用{}块中使用。是对的吗?应该处理的其他类型的变量是什么?

在.NET中,实现IDisposable的所有对象都应该显式地释放(或者在using块中使用)。

我在某个地方读到,必须手动处理非托管代码。是这样吗?什么是非托管代码?我如何知道变量是托管的还是非托管的?

你可能指的是非托管资源,因为代码不能被处理.所有使用非托管资源的类(未在托管堆上分配内存,win32句柄.)应该实现IDisposable,并且应该明确地进行处理,因为它们不是由垃圾收集器管理的。

最后,如何处理变量?我知道that ()方法并没有真正地释放变量。那么处置()是做什么的呢?我应该将它们设置为null()吗?垃圾收集器的工作逻辑是什么?

我不太明白你的问题..。如果不释放变量,则由垃圾收集器管理。当不再使用托管内存时,所有托管内存都会自动释放(也就是说,代码无法访问它,因为没有对它的引用)。IDisposable.Dispose方法仅适用于不受GC管理的资源。

编辑:作为附带说明,我想补充一点,IDisposable主要用于清理非托管资源,但也经常用于执行其他清理操作和保证状态或数据完整性。例如,IDbTransaction实现IDisposable,以便在提交事务之前发生异常时回滚事务:

代码语言:javascript
运行
复制
using (var trx = connection.BeginTransaction())
{
    // Do some work in the transaction
    ...

    // Commit
    trx.Commit();

} // the transaction is implicitly rolled back when Dispose is called
票数 5
EN

Stack Overflow用户

发布于 2010-08-15 14:11:49

在Java中,您“关闭”而不是"dispose“。

  • JDBC连接,除非您从池中获得它们。
  • JDBC ResultSets,取决于JDBC连接器。
  • InputStreams、OutputStreams、读取器和作家(字节数组和字符串支持的除外)。

一些第三方Java库或框架的类需要手动处理/关闭/销毁。

票数 4
EN

Stack Overflow用户

发布于 2010-08-15 14:04:06

.NET

  1. 实现IDisposable接口的所有对象都要求在不再需要它们时调用它们的Dispose方法。using块只是一个try- C#块的C#糖,它在finally块中处理IDiposable,只要它不是null。因此,即使在try块中抛出异常,也会发生处理。
  2. 非托管代码
  3. Dispose方法可以执行编写Dispose方法的开发人员所放入的任何代码!通常,这涉及释放“非托管”资源,这些资源不是由运行时管理的,例如数据库连接、窗口句柄和文件句柄。请注意,GC管理堆,因此在引用变为不可访问的对象之前将引用设置为null不会有太大帮助。

这是一个读得好

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3487667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档