在 C# 中,虽然大部分的内存管理是由垃圾回收器自动处理的,但有些资源类型和对象仍然需要你主动释放。以下是一些常见的需要手动释放的资源类型:
-
文件流 (
FileStream
):- 使用
FileStream
对象时,需要调用Dispose()
方法来释放文件句柄。通常可以使用using
语句来确保资源被自动释放。
using (FileStream fs = new FileStream("example.txt", FileMode.Open)) {// 使用 fs } // fs 自动被释放
- 使用
-
网络流 (
NetworkStream
):- 类似于文件流,
NetworkStream
也需要手动释放,最好使用using
语句。
using (NetworkStream ns = client.GetStream()) {// 使用 ns } // ns 自动被释放
- 类似于文件流,
-
数据库连接 (
SqlConnection
等):- 数据库连接对象应当显式调用
Dispose()
或使用using
语句。
using (SqlConnection conn = new SqlConnection(connectionString)) {conn.Open();// 使用 conn } // conn 自动被释放
- 数据库连接对象应当显式调用
-
图形对象 (
Graphics
,Bitmap
,Image
等):- 图形对象和图像对象在使用后需要释放它们占用的资源。
using (Bitmap bmp = new Bitmap("image.png")) {// 使用 bmp } // bmp 自动被释放
-
线程 (
Thread
):- 如果你创建了新的线程并使用了它,应该确保线程完成后正确释放。虽然线程本身不会直接占用大量资源,但要注意同步和线程的结束。
-
非托管资源:
- 如果你的类使用了非托管资源(如通过 P/Invoke 调用的 API),你需要实现
IDisposable
接口,并在Dispose
方法中释放这些资源。
public class MyClass : IDisposable {private IntPtr unmanagedResource; // 非托管资源public void Dispose(){// 释放非托管资源if (unmanagedResource != IntPtr.Zero){// 释放资源unmanagedResource = IntPtr.Zero;}}// 实现 IDisposable 的析构函数~MyClass(){Dispose();} }
- 如果你的类使用了非托管资源(如通过 P/Invoke 调用的 API),你需要实现