Всегда ли нормально не инициализировать значение явно, если вы устанавливаете его только на значение по умолчанию?

#c#

#c#

Вопрос:

Resharper просто подсказал мне эту строку кода:

 private static bool shouldWriteToDatabase = false;
  

это указывает на то, что я не должен говорить «= false», потому что bools, по-видимому, по умолчанию имеет значение false в C #. Я программирую на C # более полутора лет и никогда не знал этого. Я думаю, это просто проскользнуло сквозь трещины, но это заставляет меня задуматься, что такое хорошая практика.

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

Комментарии:

1. Я не согласен с этим правилом ReSharper, и я бы немедленно отключил его, если бы мне пришлось использовать ReSharper. Кто когда-нибудь помнит, какие значения по умолчанию?

2. @DavidePiras Хотя я согласен с тем, что отключаю это правило, я категорически не согласен с вашим вторым утверждением. Каждый разработчик C # должен иметь базовое представление о значениях по умолчанию — и это легко сделать в .NET, поскольку правила CLI для значений по умолчанию в основном являются «нулевыми» значениями. Вам нужно только запомнить null для ссылочных типов, false для bool и ноль для всех примитивных числовых типов. Это становится странным, только когда вы смотрите на такие типы, как DateTime и т. Д., Но Для этих типов значение по умолчанию обычно никогда не является хорошим значением инициализации…

3. @DavidePiras Какие значения по умолчанию вы не знаете?

4. @Reed Copsey — Вы также вряд ли будете использовать такие типы, как DateTime, без предварительного использования DateTime . Теперь, например, сначала (поскольку вы знаете, что это требуется) новое DateTime(…) с определенным значением, которое вы имеете в виду.

5. Я просто не помню, теперь благодаря Reed я узнал что-то новое, что имеет смысл, дата и время неприятны, и когда вы включаете обработку всех предупреждений как ошибок, иногда вы получаете ошибку, когда не присваиваете значение. Мне нравится, когда все должно быть явным, поэтому, если другой разработчик или я забыли, эти правила в любом случае могут быстро проясниться.

Ответ №1:

Лично я думаю:

  • Хорошо быть явным, если ваш код полагается на начальное значение.
  • Если ваш код не зависит от начального значения, его исключение имело бы больше смысла и меньше загромождало код.

Однако я не думаю, что Resharper может легко обнаружить разницу между этими двумя ситуациями.

Комментарии:

1. Хорошо. Тогда я поставлю resharper на его место! 🙂

2. Почему хорошо быть явным? Мне кажется, это отвлекает меня. Я имею в виду, если вы не знаете, что bool значение по умолчанию равно false , тогда у вас есть другие проблемы… Похоже на высказывание if (b == true) ... . Опять же, отвлекающий фактор, поскольку он избыточен.

3. @Kirk Woll: bool x = false; означает «Я хочу, чтобы этот элемент изначально был false». Это сильно отличается от bool x; того, в котором говорится: «Может быть, я хочу, чтобы этот элемент изначально был false , или, может быть, я не использую начальное значение, или, возможно, я просто забыл его инициализировать. Я оставлю вас догадываться, что именно. »

4. @Mark, bool x; поскольку объявление поля просто всегда означает (для меня), что я имею в виду, что оно должно быть false .

5. Мне нравится быть явным, особенно для типов с нулевым bool? x значением;, что по умолчанию? 🙂 Помогает другим программистам, особенно когда они могут либо искать начальные значения в определении, во всех конструкторах, заводских методах или странных методах инициализации.

Ответ №2:

Я единственный, кто думает, что это = false; просто не загромождает код? Как разработчик, который поддерживает приложения, в основном написанные другими, четкое изложение того, что вы имеете в виду, может быть очень полезным. Да, по умолчанию в C # используется значение false, но когда вы просматриваете чужой код, может возникнуть путаница, было ли это предполагаемое поведение или они просто были небрежными.

Ответ №3:

Лично значения по умолчанию документируются так же хорошо, как и все остальное на языке (C # или любом другом языке). Это достаточно просто, чтобы это следовало предположить, т. Е. int начинается с 0 . Для меня выделяется сценарий, если вы хотите, чтобы огромный массив int s содержал 0. Вы собираетесь это определить или просто позволить C # инициализировать его с помощью 0s?

Кажется немного нелогичным предполагать, что большие массивы int s равны 0s, но указывать, что bool это значение равно false . Указание базовой переменной, но не более сложной структуры. Поэтому я ничего не инициализирую значением по умолчанию для обеспечения согласованности.

Комментарии:

1. Хотя вы очень хорошо отметили согласованность, вы упустили из виду, что а) в отличие от bool , инициализацию содержимого массива нелегко выполнить в одной строке и б) в отличие от bool, явная (повторная) инициализация значений в массиве приведет к значительным дополнительным затратам производительности.приведите массив к их значениям по умолчанию. Эти два момента для меня означают, что допустимо рассматривать две ситуации по-разному. Но 1 в любом случае.