- 使用
Dispose
方法(实现IDisposable
接口)
- 接口介绍:
- 在.NET 中,
IDisposable
接口提供了一种标准的机制来释放非托管资源。非托管资源包括文件句柄、数据库连接、网络套接字等。这些资源不受.NET 垃圾回收器(Garbage Collector,GC)的直接控制,需要手动进行释放,以避免资源泄漏。
- 实现
IDisposable
接口的类示例(以文件流为例):
- 当使用
FileStream
类读取或写入文件时,它会占用系统资源,如文件句柄。
class MyFileHandler : IDisposable { private FileStream _fileStream; public MyFileHandler(string filePath) { _fileStream = new FileStream(filePath, FileMode.Open); } public void ReadData() { // 读取文件数据的逻辑 byte[] buffer = new byte[1024]; _fileStream.Read(buffer, 0, buffer.Length); } public void Dispose() { _fileStream.Dispose(); } }
- 在上述代码中,`MyFileHandler`类用于处理文件操作。在构造函数中,它打开一个`FileStream`来读取文件。`Dispose`方法被实现,用于释放`FileStream`占用的资源。 - **使用`using`语句块进行资源释放**: - `using`语句是一种方便的语法糖,它可以确保在代码块执行完毕后自动调用`Dispose`方法。 - ```csharp class Program { static void Main() { using (MyFileHandler fileHandler = new MyFileHandler("test.txt")) { fileHandler.ReadData(); } // 当离开using块时,fileHandler的Dispose方法会自动被调用 } }
- 在这个示例中,当
using
语句块中的代码执行完毕后,MyFileHandler
对象的Dispose
方法会被自动调用,从而释放FileStream
资源。
- 通过垃圾回收器(Garbage Collector)自动回收
- 垃圾回收器工作原理:
-.NET 的垃圾回收器是一种自动内存管理机制。它会定期扫描托管堆(Managed Heap),识别那些不再被程序引用的对象。一旦确定对象不再被引用,垃圾回收器就会回收这些对象占用的内存空间,将其标记为可用空间,以便后续分配给新的对象使用。 - 触发垃圾回收的情况:
- 垃圾回收器会根据一定的算法和条件来决定何时进行回收。一般来说,当托管堆的内存使用达到一定阈值时,垃圾回收器会被触发。另外,某些情况下,如程序主动调用
GC.Collect()
方法(虽然不建议频繁使用,因为这可能会影响性能),也会触发垃圾回收。 - 例如,在一个包含大量对象创建和销毁的应用程序中,垃圾回收器会自动管理内存。假设我们有一个简单的控制台应用程序,它会不断创建和销毁字符串对象:
class Program { static void Main() { for (int i = 0; i < 10000; i++) { string myString = "Test String " + i; // 这里myString对象在每次循环结束后,可能会被垃圾回收 } } }
- 在这个循环中,每次创建的`string`对象在循环结束后,如果没有其他引用指向它,就会成为垃圾回收器回收的候选对象。垃圾回收器会在适当的时候回收这些字符串对象占用的内存。 - **优化垃圾回收性能**: - 虽然垃圾回收器是自动工作的,但开发者可以采取一些措施来优化其性能。