You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何显式调用类的析构函数?尝试GC操作未生效

正确触发C# Flight类析构函数的方法

C#里的析构函数(也叫终结器)是由垃圾回收器(GC)自动调用的,无法手动直接调用。你之前的操作没生效,大概率是对象还被未释放的引用持有,或者Debug模式的优化限制导致GC没触发回收。可以按照以下步骤调整:


1. 确保对象没有被存活引用绑定

把Flight对象放在独立的代码块(作用域)中,确保作用域结束后,变量不再被引用:

class Flight
{
    public static int count = 0;
    public Flight() => count++;
    
    ~Flight()
    {
        count--;
        Console.WriteLine("Flight is removed.....");
    }
}

static void Main(string[] args)
{
    // 独立作用域,结束后flight变量失效
    {
        Flight flight = new Flight();
        Console.WriteLine($"创建对象后count: {Flight.count}");
    }

    // 强制GC执行回收
    GC.Collect();
    // 等待所有终结器执行完成
    GC.WaitForPendingFinalizers();

    Console.WriteLine($"回收后count: {Flight.count}");
    Console.ReadKey();
}

2. 切换到Release模式测试

Debug模式下,CLR会延长对象的生命周期(方便调试),即使你把对象赋值为null,GC也可能不会立即回收。切换到Release模式运行,才能看到真实的回收效果。

3. 排查是否有其他隐藏引用

如果还是没生效,检查代码中是否存在其他持有Flight对象的引用:

  • 静态变量对Flight对象的引用
  • 其他类的实例属性/字段持有该对象
  • 事件订阅没取消,导致引用链存在

这些情况都会让GC认为对象还在被使用,不会触发终结器。

注意事项

  • 终结器运行在GC的专用线程中,如果你在终结器里调用Console.ReadKey(),可能会出现线程阻塞的问题,建议测试时先移除该代码,确认终结器执行后再按需调整。
  • 不要依赖终结器执行关键业务逻辑,因为GC的回收时机不确定。如果需要确定性释放资源,应该实现IDisposable接口,手动调用Dispose()方法。

内容的提问来源于stack exchange,提问作者Utsav Katharotiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:04:58