在.NET中处理内存

在.NET中处理内存,.net,.net,我是.NET的初学者。NET说内存释放是自动处理的,但我在很多博客上读到,最终块将用于dbconnections来处理。如果它是自动处理的,为什么需要这样做。或者,.NET自动处理仅适用于某些不包括dbconnections的资源?。请澄清..您应该先阅读托管代码和非托管代码 (dbconnections)System.Data.SqlClient本身是托管代码。然而,它是建立在其他几个库之上的。其中有些是托管代码,有些不是 查询本身由数据库执行。因此,查询的文本(程序中硬编码的部分)将被视为托

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

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

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

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

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

  • 对实现它的任何对象调用dispose(或将其包装在using块中,如@IRSOG所示)总是一个好主意。在这种情况下,只调用close()并不特别危险。我不会养成这样的习惯。 或者使用
    (using)
    块此处有更多信息


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

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

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

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

  • 对实现它的任何对象调用dispose(或将其包装在using块中,如@IRSOG所示)总是一个好主意。在这种情况下,只调用close()并不特别危险。我不会养成这样的习惯。 或者使用
    (using)
    块此处有更多信息


    最后执行块以清理资源。控件被传递到finally块以除去资源。垃圾收集器将为您执行此操作。但很多时候,您明确希望在GC出现之前执行一段代码


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

    执行finally block以清理资源。控件被传递到finally块以除去资源。垃圾收集器将为您执行此操作。但很多时候,您明确希望在GC出现之前执行一段代码


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

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

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

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

    如果将db连接包装在using语句中,则无需使用finally,因为内部使用是通过finally实现的。如果不使用using语句,则可能需要使用finally to call dispose。这主要取决于你

    示例:

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


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

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

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

    如果将db连接包装在using语句中,则无需使用finally,因为内部使用是impl
    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();
        }
    }