我正在尝试在Ubuntu 18.10上使用Mono运行以下代码:
public class X
{
public X() { Console.WriteLine("Ctor X"); }
~X() { Console.WriteLine("Finalizer X"); }
private static Y _myY = new Y();
}
public class Y
{
public Y() { Console.WriteLine("Ctor Y"); }
~Y() { Console.WriteLine("Finalizer Y"); }
}
public class Program
{
static void Main()
{
X x = new X();
}
}
我大部分时间都会得到以下输出(尽管我认为它可能会不时改变,因为终结器的执行顺序不确定,所以总是如此)。
Ctor X
Ctor Y
Finalizer X
Finalizer Y
但是每隔一段时间,Y终结器会抛出System.NotSupportedException,该异常似乎源于正在写入标准输出的FileStream.Write方法。
有什么想法可能会发生这种情况吗?我以为Console的stdout句柄可能在Y finalizer运行之前就已关闭,但这只是一个理论。
答案 0 :(得分:0)
这可能与以下事实有关:收集的顺序是不确定的,这意味着有时Console
静态类在Y
之前被收集。
关于构造函数和破坏程序的执行顺序,我认为它总是相同的,因为:
总是在X
之前调用Y
的构造函数,因为仅当第一个static
被“触摸”时才调用默认的X
构造函数时间。
X
的销毁者总是在Y
之前被调用,因为Y
是静态成员,这意味着它是一个寿命很长的实例(即Gen2 )。
希望有帮助!