C# 的托管资源和非托管资源都有哪些

发布时间 2023-12-07 14:35:49作者: LXLR

C#的托管资源是由CLR(公共语言运行时)管理的资源,CLR在程序运行时会自动分配和回收托管资源,开发者无需手动管理。包括但不限于以下几种:

1. 对象:C#中的所有对象都是托管资源,包括类对象、数组、委托、接口等。
2. 内存:C#中的内存管理是由CLR自动进行的,CLR会自动为对象分配内存,并在对象不再使用时自动回收内存。
3. 线程:C#中的线程是托管线程,由CLR进行管理。
4. 异常处理:C#中的异常处理机制也是由CLR进行管理的,CLR会自动捕获并处理异常。
5. IO操作:C#中的IO操作也是由CLR进行管理的,CLR提供了一系列的类和接口来实现文件读写(FileStream 类就是一个托管类,它继承自 Stream 类,提供了对磁盘文件的读写操作)、网络通信等IO操作。
6. 反射:C#中的反射机制也是托管资源,通过反射可以动态地获取和操作程序集、类型、成员等。
7. 事件:C#中的事件机制也是托管资源,事件的订阅和触发都是由CLR进行管理的。

 

 

非托管资源是由操作系统管理的资源,这些资源需要手动分配和释放,否则会导致内存泄漏和资源泄漏等问题。包括但不限于以下几种:

1. COM组件:COM组件是一种非托管代码,它们是以二进制格式编写的动态链接库(DLL)。在C#中,可以使用Interop服务来访问COM组件。
2. Win32 API:Win32 API是一组用于访问Windows操作系统的函数和数据结构。这些函数和数据结构是以非托管的C/C++语言编写的,可以使用DllImport属性在C#中访问它们。
3. 非托管DLL:非托管DLL是由C/C++编写的动态链接库,其中包含了与操作系统相关的功能。可以使用DllImport属性在C#中访问非托管DLL。
4. 文件系统:文件系统是一种非托管资源,它包含了文件和文件夹,可以使用System.IO命名空间中的类来访问它们。一些非托管的 API,比如 Win32 API 中的 CreateFile、ReadFile、WriteFile 等函数。
5. 数据库:数据库是一种非托管资源,它包含了数据和结构,可以使用ADO.NET或其他ORM框架来访问它们。-*/
6. 网络:网络是一种非托管资源,它包含了网络协议和设备,可以使用System.Net命名空间中的类来访问它们。
7. 图形界面:图形界面是一种非托管资源,它包含了窗口、控件和图形渲染,可以使用Windows Forms、WPF或其他UI框架来访问它们。