带你复习c# 托管和非托管资源

带你复习c#托管和非托管资源

托管资源与非托管资源的概念

托管资源是指由CLR(公共语言运行库)进行垃圾回收和内存分配等管理的资源,常见的有.NET框架类库、用户自定义的类、字符串等。

而非托管资源是指CLR不进行资源管理的资源,常见的有操作系统资源、COM组件、指针、内存映射文件等。

如何释放非托管资源

C#中释放非托管资源一般采用IDisposable接口的方式,使用using语句或者try...finally语句来实现资源的自动释放。

示例1:用using语句实现非托管资源的自动释放

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("User32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);

    static void Main(string[] args)
    {
        IntPtr handle = IntPtr.Zero;    //获取窗口句柄
        try
        {
            handle = Process.GetCurrentProcess().MainWindowHandle;
            ShowWindow(handle, 0);    //最小化窗口
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            if(handle != IntPtr.Zero)
            {
                handle = IntPtr.Zero;   //释放句柄资源
            }
        }
    }
}

示例2:用try...finally语句实现非托管资源的自动释放

class FileStreamDemo
{
    public FileStreamDemo()
    {
        FileStream fs = null;    //定义FileStream对象
        try
        {
            fs = new FileStream("test.txt", FileMode.OpenOrCreate);   //打开指定文件
            //TODO: 进行文件读写操作
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            if(fs != null)
            {
                fs.Dispose();    //释放FileStream资源
            }
        }
    }
}

如何使用托管资源

使用托管资源的方式与普通类的方式类似,可以通过实例化类对象、调用类的成员方法、属性来使用。

示例3:使用托管资源

class MyDictionary
{
    private Dictionary<string, int> dic = new Dictionary<string, int>();   //定义Dictionary对象

    public void Add(string key, int value)
    {
        dic.Add(key, value);    //向字典对象中加入键值对
    }

    public int Get(string key)
    {
        if(dic.ContainsKey(key))
        {
            return dic[key];    //从字典中获取对应键的值
        }
        else
        {
            return -1;
        }
    }
}

static void Main(string[] args)
{
    MyDictionary dict = new MyDictionary();   //实例化MyDictionary对象
    dict.Add("apple", 10);     //添加键值对
    dict.Add("banana", 20);
    Console.WriteLine(dict.Get("banana"));   //输出键对应的值
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:带你复习c# 托管和非托管资源 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C#逐行读取txt文件的方法

    当我们需要读取文本文件内容时,可以使用C#内置的System.IO命名空间中的StreamReader类。 以下是逐行读取txt文件并输出内容的代码示例: using System.IO; // 读取文件路径 string filePath = "example.txt"; // 判断文件是否存在 if (File.Exists(file…

    C# 2023年6月1日
    00
  • C#写一套最全的MySQL帮助类(包括增删改查)

    介绍说明:这个帮助类包含了六个主要的方法:ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。其中,ExecuteNonQuery用于执行不返回结果集的SQL语句;ExecuteScalar用于执行一个查询,并返回结果集中第一行的第一列;Execut…

    C# 2023年4月22日
    00
  • C#中的匿名方法实例解析

    C#中的匿名方法实例解析 什么是匿名方法 在C#中,匿名方法指的是一个没有名称的方法,通常在方法参数中直接声明并实现,可以作为委托类型的参数或返回值使用。 匿名方法的形式如下: delegate (参数列表) { // 方法体 }; 其中,delegate是委托类型,参数列表和方法体与普通的方法一样,但没有方法名。通过定义参数列表和方法体来实现特定的功能。 …

    C# 2023年6月6日
    00
  • .NET Core使用Worker Service创建服务

    .NET Core使用Worker Service创建服务 在.NET Core中,我们可以使用Worker Service来创建长时间运行的服务。Worker Service是一种轻量级的.NET Core应用程序,可以在后台运行,并执行一些任务,例如处理消息队列、定时任务等。本文将介绍如何使用Worker Service创建服务,并提供两个示例来说明如何…

    C# 2023年5月17日
    00
  • js跨域请求的5中解决方式

    JS跨域请求的5种解决方式 在Web开发中,由于浏览器的同源策略,JS脚本不能直接访问不同域名下的资源。这就导致了跨域请求的问题。本文将介绍5种解决跨域请求的方式。 解决方式1:JSONP JSONP是一种跨域请求的解决方案,它利用了script标签可以跨域请求的特性。以下是一个JSONP的示例: function handleResponse(data) …

    C# 2023年5月15日
    00
  • ASP.NET Core – 缓存之内存缓存(下)

    话接上篇 [ASP.NET Core – 缓存之内存缓存(上)],所以这里的目录从 2.4 开始。 2.4 MemoryCacheEntryOptions MemoryCacheEntryOptions 是内存缓存配置类,可以通过它配置缓存相关的策略。除了上面讲到的过期时间,我们还能够设置下面这些: 设置缓存优先级。 设置在从缓存中逐出条目后调用的 Post…

    C# 2023年4月17日
    00
  • C#字符串与正则表达式的图文详解

    C#字符串与正则表达式的图文详解 1. 什么是正则表达式 正则表达式(Regular Expression)是一种用来描述、匹配文本字符串的工具,它是由元字符和字符组成的表达式。使用正则表达式可以快捷方便的实现字符串的匹配、查找与替换等操作。 2. 正则表达式的基本语法 2.1 元字符 元字符是正则表达式中的特殊字符,其在匹配过程中具有特殊含义,常见的元字符…

    C# 2023年6月7日
    00
  • C#中泛型容器Stack的用法并实现”撤销/重做”功能

    以下是详细讲解“C#中泛型容器Stack的用法并实现”撤销/重做”功能”的完整攻略。 Stack的用法 Stack是C#中的泛型容器,用于实现“栈”这种数据结构。其中T代表栈中存储的元素类型。 Stack主要支持以下几种常用操作: Push(T item):将一个元素压入栈中 Pop():将栈顶的元素弹出并返回 Peek():返回栈顶的元素但不弹出 Clea…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部