Инициализация POD в C # - лучшая практика - PullRequest
0 голосов
/ 05 апреля 2009

Насколько я знаю [*], в C # по умолчанию обычные старые типы данных (int, float, bool и т. Д.) Имеют разумные значения. int a, float b и bool c принимают значения 0, 0.0f и false соответственно.

Предполагая, что это так:

Должен ли я явно дать своим переменным значения 0, 0.0f и false для ясности, или я должен оставить значения неявными, таким образом уменьшая объем кода, который я пишу, (возможно) уменьшая количество ошибки, которые я могу внести в программу?

[*] Честно говоря, после 10 минут поиска в Google я изо всех сил пытаюсь найти соответствующую документацию, которая подтверждает это! Если кто-нибудь укажет мне, я исправлю вопрос!

Ответы [ 7 ]

4 голосов
/ 05 апреля 2009

Я бы сказал, не инициализировать их (поля). Будет совершенно ясно, что происходит без них.

Я бы также сказал, чтобы не инициализировать локальные переменные, пока у вас не будет значимого значения для них, например, Я часто вижу код, похожий на следующий пример:

private void SomeMethod()
{
    SomeObject myObj = null;

    if (SomeCondition)
    {
        myObj = someValue;
    }
    else if (SomeOtherCondition)
    {
        myObj = someValue;
    }
    else
    {
        myObj = someOtherValue;
    }
}

Нулевое назначение избыточно, но я на самом деле чувствую, что оно разрушительно, как если бы мы забыли назначить myObj в одном из путей кода, например, если бы мы присвоили yourObj скорее myObj в else, то в итоге мы установили бы для myObj значение null, которое в конечном итоге проявилось бы как исключение нулевой ссылки в более поздний момент времени выполнения. Без начального нулевого присваивания это было бы ошибкой компиляции - с ней гораздо проще справиться.

4 голосов
/ 05 апреля 2009

C # не не присваивает значение по умолчанию локальным переменным. Эти значения по умолчанию применяются только к полям (членам класса).

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

static void Test() {
   int x;
   Console.WriteLine(x); // compile time error.
}
2 голосов
/ 05 апреля 2009

Для статических переменных / переменных экземпляра и элементов массива, да, это делает их подходящими по умолчанию. См. Раздел 5.2 спецификации C # 3.0:


Следующим категориям переменных автоматически присваиваются значения по умолчанию:

  • Статические переменные.
  • Переменные экземпляра экземпляров класса.
  • Элементы массива.

Значение переменной по умолчанию зависит от типа переменной и определяется следующим образом:

  • Для переменной типа значения значение по умолчанию совпадает со значением, вычисленным конструктором по умолчанию типа значения (§4.1.2).
  • Для переменной ссылочного типа значением по умолчанию является ноль.

Инициализация к значениям по умолчанию обычно выполняется с помощью диспетчера памяти или сборщика мусора, которые инициализируют память до нуля с нулевыми значениями до того, как она будет выделена для использования. По этой причине удобно использовать все биты-ноль для представления нулевой ссылки.


Локальные переменные не имеют значения, так как они не могут быть использованы до того, как их определенно назначат.

Что касается того, следует ли вам явно инициализировать их или нет, это в основном вопрос личных предпочтений. Я бы не стал назначать значение в объявлении, если оно будет переназначено, например, в конструкторе.

Если честно, это не та тема, которую я могу волновать с точки зрения читабельности.

1 голос
/ 05 апреля 2009

Переменные-члены инициализируются в их значения по умолчанию (то есть ноль или ноль).

Если вы присваиваете значение по умолчанию переменной-члену и выполняете анализ кода, он ловит это и выдает DoNotInitializeUnnecessually предупреждение.

0 голосов
/ 05 апреля 2009

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

  • с случайными данными в памяти
  • на поля ввода пользователя , что представляет потенциальную угрозу безопасности, особенно когда эти данные используются при взаимодействии с базой данных или, что еще хуже, с операционной системой
0 голосов
/ 05 апреля 2009

Когда CLR инициализирует примитивный тип, он делает это путем обнуления всех битов для этого типа. Так что CLR касается следующего:

int i;
bool b;

эквивалентно этому:

int i = 0;
bool b = false;

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

0 голосов
/ 05 апреля 2009

Субъективный ответ ниже:)

Мне кажется, что инициализация member переменных их значениями по умолчанию не должна выполняться. Это избыточно и не добавляет много / никакого значения к коду.

Я обнаружил, что большинство людей, которые занимаются этим, имеют большой опыт в C ++ и, следовательно, помнят, что вы должны инициализировать переменные-члены, чтобы написать правильный код (я виноват здесь). Таким образом, эта практика только что перешла на C #, где это на самом деле не нужно.

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

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