1

我是 .NET 的初学者。.NET 说内存释放是自动处理的,但我在许多博客中读到 finally 块将用于 dbconnections 进行处理。如果它是自动处理的,为什么需要这样做。或者,.NET 自动处理仅适用于某些不包括 dbconnections 的资源?请说清楚..

4

3 回答 3

2

作为一个初学者,你真的不需要太在意这个。您最终将不得不了解有关它的更多信息,但在此阶段您需要了解托管内存是由框架处理的。您需要记住,当您引用内存时,它将继续保留,直到所有引用都被释放,然后当垃圾收集器运行时,该内存将自动清理。

有些对象需要外部资源,例如文件、数据库连接、网络连接(包括 Web 请求)、位图和字体等。操作系统本身会跟踪这些东西。这些对象通常实现一个称为 IDisposable 的接口,该接口用于处理任何非托管资源。

基本上,您查看一个对象的文档,如果它实现了 IDisposable,那么您希望在对您可行的情况下尽快处理它。这是通过在其上调用 Dispose() 或使用 using 语句隐式完成的。

如果将数据库连接包装在 using 语句中,则不需要 finally,因为内部使用是通过 finally 实现的。如果不使用 using 语句,则可能需要使用 finally 来调用 dispose。这很大程度上取决于你。

例子:

using (var dbconn = new SqlConnection()) {
  // do you data access - no finally required
}

或者

SqlConnection dbconn;
try {
    dbconn = new SqlConnection();

    // do your data access
}
catch (... various exceptions) {}
finally
{
    if (dbconn != null) {
        dbconn.Close();
        dbconn.Dispose();
    }
}
于 2013-08-10T21:40:04.267 回答
0

您应该首先阅读托管代码和非托管代码..

(dbconnections)System.Data.SqlClient 本身是托管代码。但是,它是建立在其他几个库之上的。其中一些是托管代码,而另一些则不是。

  1. 查询本身由数据库执行。因此,查询的文本(在程序中硬编码的部分)将被视为托管代码,但是一旦命令发送到数据库,它就不再是托管的。

  2. 执行 .close 命令后,连接本身将从您的 .net 应用程序中释放并返回到连接池(OLEDB、ODBC 和/或其他子系统的一部分)。此时,连接被释放,非托管部分被释放。Dispose 将完成所有关闭操作并释放其他托管部分(连接字符串等)。

在实现它的任何对象上调用 dispose 总是一个好主意(或将其包装在 using 块中,如 @IRSOG 所示)。在这种情况下,调用 close() 并不是特别危险。我不会养成这样的习惯。或(using )在这里使用块是更多信息http://www.codeproject.com/Articles/6564/Understanding-the-using-statement-in-C

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}
于 2013-08-10T18:26:20.590 回答
-1

finally 块用于清理资源。控制权被传递给 finally 块以摆脱资源。垃圾收集器将为您执行此操作。但是有很多时候,您明确希望在 GC 出现之前执行一段代码。

有时在某些情况下,即使出现异常,您也希望执行某些代码,然后最终也会出现。

于 2013-08-10T18:26:31.070 回答