Получение NotSupportedException при записи из финализатора - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь запустить следующий код, используя Mono в Ubuntu 18.10:

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();
    }
}

Большую часть времени я получаю следующий вывод (всегда в таком порядке, хотя я думал, что со временем он может измениться)время от времени порядок выполнения финализаторов не является детерминированнымна стандартный вывод.

Есть идеи, почему это может произойти?Я подумал, что, возможно, дескриптор стандартного вывода консоли закрыт перед запуском финализатора Y, но это только теория.

1 Ответ

0 голосов
/ 20 декабря 2018

Это может быть связано с тем фактом, что порядок сбора недетерминирован, то есть иногда статический класс Console собирается до Y.

Относительно порядка выполнения конструкторов.и разрушители, я думаю, что это всегда то же самое, потому что:

  • Конструктор X всегда вызывается раньше Y, потому что конструктор по умолчанию static вызывается только тогда, когда X "трогается" впервые.

  • Разрушитель X всегда вызывается раньше Y, потому что Y является статическим членом, то естьдолгоживущий экземпляр (т.е. Gen2 ).

Надеюсь, это поможет!

...