• 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;
           }
       }

  • 相关阅读:
    lntelliJ IDEA 皮肤设置
    Maven安装与配置
    lntelliJ IDEA 使用 Maven 与 每次新建项目都需要重新配置的解决方案
    Spring Boot 扫描机制说明
    Spring Boot Filter 使用指南
    Gradle构建CAS4.2.7爬坑指南
    Java的垃圾回收
    final与static
    angular directive自定义指令
    ui-router
  • 原文地址:https://www.cnblogs.com/hanguoshun/p/12738490.html
Copyright © 2020-2023  润新知