我遇到了一个面试问题,我不知道答案(小帮助:)) 它说了一些东西:
Class SomeClass : IDisposable
{
public void Dispose()
{
while(true)
{
}
}
~SomeClass()
{
Dispose();
}
}
1)在下一个GC之后不再引用时,对象是否已完成?我的答案是否定的,因为终结线程将停留在无限循环上。
2)在Dispose中可以做什么来结束最终化以及在对象被处置之前循环继续多少次(不考虑它将在下一代中花费的时间)
我并不是特别清楚确切的问题(2)。我有点没时间了......
不知道答案我把一个静态计数器变为3并调用break并声明3 这在技术上会起作用:),但那不是答案
我猜它与GC.SupressFinalize()有关吗? 可能在进入循环之前调用GC.SupressFinalize()?
任何想法,如果没有回答不清楚的问题,更多的是他们可能的目标?
答案 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();
}
}