Stati c Свойства только для чтения, не возвращающие значения - PullRequest
1 голос
/ 04 августа 2020

У меня есть класс с большим количеством переменных c только для чтения, которые будут сохранены в файле конфигурации после того, как он заработает. Среди них у меня есть значение размера шрифта по умолчанию и довольно много других переменных, которые ссылаются на этот размер шрифта по умолчанию. Одна и только одна из этих переменных возвращает 0, а не значение размера шрифта по умолчанию.

У меня аналогичная проблема с моими переменными FontName, но для краткости они исключены из примера кода.

Соответствующий код приведен ниже в том порядке, в котором он отображается в моем классе. Я попытался переместить объявление размера шрифта по умолчанию сразу над объявлением размера шрифта основного текста; это привело к тому, что все переменные вернули 0, а не размер шрифта по умолчанию. Возврат объявления в исходное положение заставил другие переменные снова начать работать.

Я также попытался изменить varaiable на свойство stati c с помощью только геттера. Это свойство возвращает размер шрифта по умолчанию, как и ожидалось.

Я дважды проверил, что все перечисленные ниже объявления существуют в одной и той же области.

И, конечно же, я сделал полное решение, чистое и перестроенное без изменения поведения.

Также обратите внимание, что переменные не генерируют исключения: они просто возвращают 0.

//private static float _BodyFontSize { get => _DefaultFontSize; }  //returns 9
private static readonly float _BodyFontSize = _DefaultFontSize;    //returns 0

...

private void MyMethod()
{
   //where my breakpoint is at

   ...
}

...

private static readonly float _DefaultFontSize = 9;
...
private static readonly float _DetailsFontSize = _DefaultFontSize;   //returns 9
...
private static readonly float _AddressFontSize = _DefaultFontSize;   //returns 9

...

private void AnotherMethod()
{
   ...
}

...

private static readonly float _BlurbFontSize = _DefaultFontSize;  //returns 9

1 Ответ

0 голосов
/ 04 августа 2020

Спецификация языка stati c раздел инициализации поля объясняет это поведение:

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

Итак, в вашем случае _BodyFontSize является инициализирован до _DefaultFontSize и использует значение по умолчанию для float, равное 0. Перемещение _BodyFontSize после _DefaultFontSize устранит вашу проблему (как и с рабочими), но я думаю, что лучшим вариантом было бы обработать эту инициализацию в stati c constructor , несмотря на то, что это простые присваивания.

...