带你复习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#多线程死锁介绍与案例代码

    C#多线程死锁介绍与案例代码 死锁的概念 死锁(Deadlock)指的是多个线程因相互等待而陷入的一种僵局,每个线程都在等待其他线程释放资源。因此,所有线程都处于无法继续执行的状态,形成了死锁。 死锁产生的原因 死锁是由于多个线程相互等待对方所占用的资源而产生的。举例来说,有两个线程 A 和 B,他们需要占用相互持有的两个资源 R1 和 R2,但由于占用资源…

    C# 2023年5月31日
    00
  • 如何用C#找出数组中只出现了一次的数字

    下面是如何用C#找出数组中只出现了一次的数字的完整攻略。 问题描述 在一个整数数组中,除了一个数字只出现一次之外,其他数字都出现了两次。请找出那个只出现一次的数字。 解题思路 由于数组中只有一个数字出现一次,其他数字都出现了两次,那么可以先将数组中的数字进行排序,然后遍历这个排序后的数组,每次比较当前数字和它后面的数字是否相同,如果不相同则说明当前数字只出现…

    C# 2023年6月1日
    00
  • C#中try…catch的使用与常见面试题分享

    当我们在写代码时,难免会遇到一些异常情况,如:文件读取失败、网络连接超时等等。这时,我们需要使用到异常处理机制,来解决这些问题并保证程序的正常运行。而C#中的try…catch就是一种常用的异常处理机制。 try…catch的基本语法 如图所示,try代码块中包含可能会发生异常的代码,catch代码块用来捕获异常并处理异常。如果try代码块中的代码成…

    C# 2023年6月6日
    00
  • c#连接数据库及sql2005远程连接的方法

    连接数据库是C#开发中经常遇到的问题。本篇文章将为大家介绍C#连接本地及远程数据库SQL Server 2005的方法,其中包括Windows身份验证以及SQL Server身份验证两种方式,并且针对远程连接还需要注意一些防火墙和网络设置的问题。下面,我们就来一步步看如何C#连接数据库及SQL Server 2005远程连接的方法。 1.连接本地SQL Se…

    C# 2023年6月1日
    00
  • ASP.NET MVC学习教程之Razor语法

    一、什么是Razor语法? Razor语法是ASP.NET MVC中常用的视图引擎之一,它是一种轻量级模板语法,可以让开发者更方便地生成HTML代码以及与之相关的代码逻辑。Razor语法可以在ASP.NET Web Pages、ASP.NET MVC、ASP.NET Web API和ASP.NET Core等多个平台上使用。 二、如何在ASP.NET MVC…

    C# 2023年5月31日
    00
  • ASP.NET自带对象JSON字符串与实体类的转换

    在ASP.NET项目中,我们常常需要将一个JSON字符串转换成一个实体对象,或者将一个实体对象转换成JSON字符串。ASP.NET提供了方便的自带对象来处理这种转换,下面将详细讲解实现的步骤。 1. 将JSON字符串转换成实体类对象 将JSON字符串转换为实体类对象的基本步骤如下: 引入命名空间 我们需要引入System.Web.Script.Seriali…

    C# 2023年5月31日
    00
  • 魔兽世界8.3新版本橙装幻化规则是什么 魔兽世界8.3橙装幻化规则介绍

    魔兽世界8.3新版本橙装幻化规则是什么 摘要 本篇攻略主要讲述魔兽世界8.3新版本橙装幻化规则。橙装幻化是一种帮助玩家外观扮靓,无需牺牲实用性的功能。本攻略将深入介绍橙装幻化的获取方法和具体规则。 橙装幻化获取方法 装备橙色装备:在8.3版本中,所有橙色装备都自带幻化属性。只要装备了橙色装备,玩家就可以自动获得该装备的幻化,而无需使用专门的幻化物品进行幻化。…

    C# 2023年5月31日
    00
  • C# Pointer指针应用实例简述

    C# Pointer指针应用实例简述 在C#语言中,指针(Pointer)是一个非常重要的概念,它可以让我们高效地进行内存操作。本文将简单介绍指针的基本概念,并通过两个应用实例说明指针的具体操作方法。 指针的基本概念 指针是一个变量,它存储着另一个变量的内存地址。在C#中,通过使用关键字“unsafe”来开启指针使用的权限。同时,为了增加运行时的安全性,C#…

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