带你复习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日

相关文章

  • FileStream常用的属性与方法总结

    根据你的需求,我会为你详细讲解一下“FileStream常用的属性与方法总结”的攻略。 概述 FileStream是.NET Framework中对文件进行读写操作的一个类,它继承自System.IO.Stream类。FileStream类可以对任何类型的文件进行读写操作,并提供了丰富的属性和方法,方便程序员对文件进行操作。在使用FileStream前,需要…

    C# 2023年6月1日
    00
  • 一篇文章带你轻松了解C# Lock关键字

    一篇文章带你轻松了解C# Lock关键字 Lock关键字是什么 Lock是C#编程中非常重要的一个关键字,主要用来进行多线程编程时的同步控制。在多线程程序中,不同的线程会同时对同一数据进行访问,如果没有同步控制,则有可能发生数据竞争的问题。使用Lock关键字可以保证在同一时间只有一个线程对共享资源进行访问。 Lock关键字的用法 Lock关键字用法非常简单,…

    C# 2023年5月15日
    00
  • C#连续任务Task.ContinueWith方法

    下面是关于”C#连续任务Task.ContinueWith方法”的完整攻略。 什么是Task.ContinueWith方法 在C#中,Task.ContinueWith方法用于在一个任务完成后执行一些额外的操作。具体来说,该方法使得一个任务能够与另一个相关的任务链接起来,当前一个任务完成后,可以立即启动与它相关的下一个任务,从而形成一个连续的任务链。 Tas…

    C# 2023年6月6日
    00
  • C#窗体间常用的几种传值方式及委托与事件详解

    C#窗体间常用的几种传值方式及委托与事件详解 本文将介绍C#窗体之间常用的几种传值方式,包括参数传递、全局变量、委托、事件等,并详解委托与事件的概念和使用方法。 参数传递 参数传递是最简单的窗体之间传值的方式,即在调用方法时将参数传递给被调用方法。 示例: public partial class Form1 : Form { public Form1() …

    C# 2023年5月31日
    00
  • 一次.net core异步线程设置超时时间的实战记录

    一次.NET Core异步线程设置超时时间的实战记录需要注意以下几个步骤: 1. 使用 CancellationToken 以便能够取消异步操作 CancellationToken 是一个用于在异步执行期间通知它们应该被取消的对象。在异步操作中可以使用 CancellationToken 实例来获得通知。 在C#中,可以通过以下代码创建一个 Cancella…

    C# 2023年6月3日
    00
  • .Net Core跨平台应用开发串口篇HelloArm

    .NET Core跨平台应用开发串口篇HelloArm 在本攻略中,我们将详细讲解如何使用.NET Core开发跨平台应用程序,并使用串口进行通信。我们将提供两个示例说明。 开发环境 在开始本攻略之前,需要准备以下开发环境: .NET Core SDK Visual Studio Code C#扩展程序 创建.NET Core应用程序 在开始本攻略之前,需要…

    C# 2023年5月16日
    00
  • asp.net 备份和恢复数据库的方法示例

    当我们在开发ASP.NET项目的时候,经常需要用到对数据库的备份和恢复。本文将详细介绍如何使用SQL Server Management Studio(SSMS)和Transact-SQL(T-SQL)备份和恢复数据库,以及在ASP.NET中使用C#代码备份和恢复数据库。 使用SQL Server Management Studio(SSMS)备份和恢复数据…

    C# 2023年5月31日
    00
  • NavMesh寻路网格自动生成和动态障碍技术、Navmesh入门教程

    NavMesh寻路网格自动生成和动态障碍技术 什么是NavMesh Navmesh是一种建立在游戏场景中的三角形网格,用于计算游戏对象在场景中的路径。在Unity中,Navmesh是使用NavMesh Agent进行移动的。 NavMesh自动生成 Unity提供了一个自动生成NavMesh网格的功能,可以通过以下步骤使用: 在3D场景中选择需要为其生成Na…

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