Почему в C# порядок имеет значение для статической инициализации?

Я не уверен, почему вышеупомянутые ответы должны использовать hasOwnProperty().

Просто короче и удобочитаемее просто проверить, существует ли это свойство:

sortAndFilterProviders() {
  const noAmountList = myList(item => !item['amount']);
  const amountList = myList(item => item['amount']);

  amountList.sort( (a, b) => {
    const a1 = a.amount, 
    b1 = b.amount;
    if (a1 == b1) {
      return 0;
    };
    return a1 > b1 ? 1 : -1;
   });

   console.log(amountList); // check if it is sorted
   return [... noAmountList, amountList];
 }
8
задан Community 23 May 2017 в 12:26
поделиться

4 ответа

Я могу предположить программиста в зависимости от порядка инициализации из-за побочных эффектов с другими статическими классами. Вы и я, оба знают, что в зависимости от побочных эффектов плохая практика, но это не обязательно недопустимо.

Рассмотрите что-то вроде этого:

class Foo
{
    static string header = Bar.GetHeader();
    static string version = Bar.GetVersion();
}

И Bar.GetVersion принимает это Bar.GetHeader был назван. Если бы компилятор был бесплатным изменить порядок инициализации, то программист не смог бы гарантировать порядок инициализации.

Ужасный, предоставленный, но совершенно законный. Если Вы воображаете эффекты второго порядка (т.е. названные статические методы, которые сами зависят от классов, которые имеют побочные эффекты), Вы видите, что для компилятора невозможно надежно перестроить что-либо, как для компилятора невозможно (в целом) перестроить порядок вызовов функции в Вашем статическом конструкторе.

6
ответ дан 5 December 2019 в 08:26
поделиться

Инициализаторы являются просто синтаксическим сахаром. Компилятор помещает тот код в .cctor, когда он компилирует Ваш класс и это pust их в заказах, они размечаются в коде.

Это не осуществляет проверок, потому что это не имело бы смысла. У Вас могли все еще быть циклы инициализации, таким образом, это не будет работать так или иначе.

Я вел блог об этом некоторое время назад, если Вам интересно:

12
ответ дан 5 December 2019 в 08:26
поделиться

C# делает проверки на этапе выполнения для обнаружения первого доступа к классу, но не переупорядочивает статическую инициализацию в классе.

Статические поля инициализируются сверху донизу сопровождаемые статическими конструкторами сверху донизу. Или измените порядок своих полей или создайте статического конструктора и инициализируйте поля от tehre.

Посмотрите Переменные инициализаторы в спецификации C# или этой статье об инициализаторах.. Кроме того, Порядок вопроса статических конструкторов/инициализаторов в C# связан.

1
ответ дан 5 December 2019 в 08:26
поделиться

Я думаю, что необходимо использовать, статический конструктор.

Как так

class Foo
{
    static List<int> to;
    static IEnumerable<int> from;

    static Foo()
    {
        from = Something();
        to = new List<int>(from);
    }
}

Относительно того, почему C# не делает этого на первом доступе, я просто не вижу потребность в такой сложности, когда существуют другие альтернативы, которые проясняют, что происходит.

1
ответ дан 5 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: