我是 .NET 的初学者。.NET 说内存释放是自动处理的,但我在许多博客中读到 finally 块将用于 dbconnections 进行处理。如果它是自动处理的,为什么需要这样做。或者,.NET 自动处理仅适用于某些不包括 dbconnections 的资源?请说清楚..
3 回答
作为一个初学者,你真的不需要太在意这个。您最终将不得不了解有关它的更多信息,但在此阶段您需要了解托管内存是由框架处理的。您需要记住,当您引用内存时,它将继续保留,直到所有引用都被释放,然后当垃圾收集器运行时,该内存将自动清理。
有些对象需要外部资源,例如文件、数据库连接、网络连接(包括 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();
}
}
您应该首先阅读托管代码和非托管代码..
(dbconnections)System.Data.SqlClient 本身是托管代码。但是,它是建立在其他几个库之上的。其中一些是托管代码,而另一些则不是。
查询本身由数据库执行。因此,查询的文本(在程序中硬编码的部分)将被视为托管代码,但是一旦命令发送到数据库,它就不再是托管的。
执行 .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();
}
finally 块用于清理资源。控制权被传递给 finally 块以摆脱资源。垃圾收集器将为您执行此操作。但是有很多时候,您明确希望在 GC 出现之前执行一段代码。
有时在某些情况下,即使出现异常,您也希望执行某些代码,然后最终也会出现。