C# 托管资源与非托管资源(自己总结)

其实我的关注点是哪些需要手动的去释放资源。

包括:比如文件流、图像图形类、数据库的连接,网络连接,系统的窗口句柄,打印机资源等,这类资源一般不存在堆上。可以认为操作系统资源的一组API。具体可以参考MSDN

我的理解是主要有两种情况:

一、这些需要手动释放资源的变量出现在类的方法里,当方法结束的时候需要去手动或显示的释放这些资源。比如下边代码,通过用using 显示释放资源

using(SqlConnection conn = new SqlConnection())

{

      //do something;

}

c#使用using简化输入,编译器自动翻译成 try...finally,等同于下面写法

SqlConnection conn = new SqlConnection();

try

{

    //do something;

}

finally

{

    conn.Dispose();

}
使用using要求后边的实例必须实现IDisposable接口

二、这些需要手动释放资源的变量出现在类的字段里,这时候需要让这个类实现IDisposable接口,程序别的地方用到这个类实例的时候,就可以通过调用实例的Dispose()来显示的释放资源

标准清理模式,代码如下:
MyClass:IDisposable
    {
        private bool disposed = false;
        ~MyClass()
        {
            Dispose(false);
        }
   
        public void Dispose()
        {
           Dispose(true);
           GC.SuppressFinalize(this);
        }
      
       private void Dispose(bool disposing)
       {
          if(disposed == false)
          {
               if(disposing == true)
               {
                  // 释托管代码
                  ......
               }
              // 释非代码
             ......
          }
          disposed = true;
       }
   }

原文地址:https://www.cnblogs.com/hanguoshun/p/12738490.html