Не в состоянии инициировать статические переменные в c # из Unity - PullRequest
0 голосов
/ 29 апреля 2018

Я пытался сделать синглтон в Unity 2017 .

public class Singleton {

    public static readonly Singleton instance = new Singleton();

    static readonly float FLOAT_VAL = 3.5f;
    static readonly int INT_VAL = 3;

    private Singleton() {
        Debug.Log("FLOAT_VAL = " + FLOAT_VAL);
        Debug.Log("INT_VAL = " + INT_VAL);
    }
}

Я ожидал увидеть вывод "FLOAT_VAL = 3.5" и "INT_VAL = 3" . Тем не менее, он получил выходные данные "FLOAT_VAL = 0" и "INT_VAL = 0" . Затем я удалил оба модификатора «только для чтения», оставив «статический», и все равно получил два нуля.

Что случилось с инициацией или созданием этого синглтона? Как я могу правильно дать значения статическим переменным? Есть что-нибудь общее с Unity? (Я выбрал il2cpp при сборке проекта, но это было протестировано в режиме редактора)

Кстати, я выяснил, что инициализация переменной "instance" не начиналась до первого вызова (раньше я думал, что все статические переменные инициализируются при загрузке сборки. ). Это тоже еще одна особенность Unity или просто нормальная?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Если ваш класс содержит статические поля, предоставьте статический конструктор, который инициализирует их при загрузке класса. [MSDN]

Добавить статический конструктор для инициализации ваших статических переменных

0 голосов
/ 29 апреля 2018

Из спецификации языка C #

§10.5.5.1

Инициализация статического поля

Инициализаторы статических переменных поля класса соответствуют последовательность назначений, которые выполняются в текстовом порядке в которые они появляются в объявлении класса. Если статический конструктор (§10.12) существует в классе, выполнение статического поля инициализаторы происходят непосредственно перед выполнением этого статического Конструктор. Иначе, инициализаторы статического поля выполняются в зависящее от реализации время до первого использования статического поле этого класса.

Итак, в основном, потому что вы сначала написали instance, оно инициализируется до FLOAT_VAL и INT_VAL. В обратном порядке вы увидите ожидаемые результаты:

public class Singleton {


    static readonly float FLOAT_VAL = 3.5f;
    static readonly int INT_VAL = 3;


    public static readonly Singleton instance = new Singleton();

    private Singleton() {
        Console.WriteLine("FLOAT_VAL = " + FLOAT_VAL);
        Console.WriteLine("INT_VAL = " + INT_VAL);
    }
}
0 голосов
/ 29 апреля 2018

Поля инициализируются в том порядке, в котором они объявлены ... так как ваш экземпляр стоит первым, остальные значения равны нулю. Если вы поместите их выше своего экземпляра, они будут иметь ожидаемые вами значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...