终结器陷入无限循环

时间:2012-01-11 20:17:27

标签: c# finalizer

我遇到了一个面试问题,我不知道答案(小帮助:)) 它说了一些东西:

Class SomeClass : IDisposable 
{
    public void Dispose()
    {
        while(true)
        {
        }
    } 

    ~SomeClass()
    {
        Dispose();
    }
}  

1)在下一个GC之后不再引用时,对象是否已完成?我的答案是否定的,因为终结线程将停留在无限循环上。

2)在Dispose中可以做什么来结束最终化以及在对象被处置之前循环继续多少次(不考虑它将在下一代中花费的时间)

我并不是特别清楚确切的问题(2)。我有点没时间了......

不知道答案我把一个静态计数器变为3并调用break并声明3 这在技术上会起作用:),但那不是答案

我猜它与GC.SupressFinalize()有关吗? 可能在进入循环之前调用GC.SupressFinalize()?

任何想法,如果没有回答不清楚的问题,更多的是他们可能的目标?

2 个答案:

答案 0 :(得分:8)

发生的事情相当无关紧要。 CLR将终止程序,终结器上有2秒超时。

答案 1 :(得分:0)

您可以使用布尔变量检查对象的处置状态,这将有助于dispose方法进入无限循环

class SomeClass : IDisposable
{

    bool _disposed = false;

    public void Dispose()
    {
        while (true && !_disposed)
        {
            _disposed = true;
            Console.WriteLine("disposed");
        }
    }

    ~SomeClass()
    {
        Dispose();
    }
}