带你复习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技术站