2024-06-24 · C# 基础 · 学习笔记

垃圾回收 GC 基础

.NET 的垃圾回收(GC)自动管理内存,不需要手动释放。堆上的对象如果没有任何引用指向它,GC 会在合适的时候回收。

GC 是分代的:第0代是刚分配的小对象,存活过一次 GC 就升到第1代,再存活就升到第2代。大多数对象在第0代就被回收了,因为它们用完就丢。Long-lived 对象(像配置、单例)在第2代。

一般业务代码不用管 GC,但要注意:1) 不要频繁分配大对象(>85KB 进 LOH,回收慢);2) 实现 IDisposable 释放非托管资源;3) 用 using 确保释放。

代码示例

// 普通对象:GC 自动回收
public class BigObject
{
    private byte[] _data = new byte[1000];
    ~BigObject() { /* 析构器 */ }
}

// 实现 IDisposable 释放资源
public class FileHolder : IDisposable
{
    private Stream? _stream;
    public FileHolder(string path) => _stream = File.OpenRead(path);

    public void Dispose()
    {
        _stream?.Dispose();
        GC.SuppressFinalize(this);
    }
}

// using 语句:出作用域自动 Dispose
using (var f = new FileHolder("data.txt"))
{
    // 使用文件
}
// 等价于 C# 8 的 using 声明
using var reader = new StreamReader("data.txt");
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。