zoukankan      html  css  js  c++  java
  • 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;
           }
       }

  • 相关阅读:
    lambba表达式
    根据某个字段筛选list数据
    git和idea绑定
    gitee创建仓库
    用 Python 3 + PyQt5 擼了一個可以播放“任意”音樂的播放器
    zabbix 共享内存设置
    Zabbix高可用,实现zabbix的无缝切换,无故障时间
    python练习题100
    斐波那契数列python实现
    随机生成指定位数密码包括大小写数字特殊符号
  • 原文地址:https://www.cnblogs.com/hanguoshun/p/12738490.html
Copyright © 2011-2022 走看看