CA1008: перечисления должны иметь нулевое значение (анализ кода) — .NET


  • Статья



Значение
Идентификатор правилаCA1008
КатегорияОформление
Исправление является критическим или не критическимНе критическое — при появлении запроса на добавление значения None в перечисление без флага. Критическое — при появлении запроса на переименование или удаление любых значений перечисления.
Включено по умолчанию в .NET 7Нет

Причина

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

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

Описание правила

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

Если перечисление с FlagsAttribute примененным определяет элемент с нулевым значением, его имя должно быть «None» (или одно из дополнительных разрешенных имен), чтобы указать, что в перечислении не заданы значения. Использование элемента с нулевым значением для любых других целей противоречит использованию FlagsAttribute в том, что AND побитовые операторы и бесполезны OR с элементом. Это означает, что только одному элементу должно быть присвоено нулевое значение. Если несколько элементов с нулевым значением встречаются в перечислении с флагами, Enum.ToString() возвращает неверные результаты для элементов, которые не равны нулю.

Устранение нарушений

Чтобы устранить нарушение этого правила для перечислений без флагов, определите элемент, имеющий нулевое значение. Это некритическое изменение. Для перечислений с флагами, которые определяют элемент с нулевым значением, присвойте этому элементу имя «None» и удалите остальные элементы, имеющие нулевые значения. Это критическое изменение.

Условия для отключения предупреждений

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

Отключение предупреждений

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

#pragma warning disable CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008

Чтобы отключить правило для файла, папки или проекта, задайте для этого правила серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA1008.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка кода для анализа

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

  • Включение определенных контактных зон API
  • Дополнительные имена полей с нулевым значением

Этот параметр можно настроить только для некоторого правила, для всех правил или для всех правил в этой категории (конструктор). Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Включение определенных контактных зон API

Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару «ключ-значение» в файл EDITORCONFIG в своем проекте:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Дополнительные имена полей с нулевым значением

В .NET 7 и более поздних версиях можно настроить другие допустимые имена для поля перечисления с нулевым значением, кроме None. Разделяйте несколько имен по символу | . В следующей таблице приведены некоторые примеры.

Значение параметраИтоги
dotnet_code_quality.CA1008.additional_enum_none_names = NeverРазрешает как, так None и Never
dotnet_code_quality. CA1008.additional_enum_none_names = Never|NothingРазрешает None, Neverи Nothing

Пример

В следующем примере показаны два перечисления, которые удовлетворяют правилу, и перечисление BadTraceOptions, которое нарушает правило.

using System;
namespace ca1008
{
    public enum TraceLevel
    {
        Off = 0,
        Error = 1,
        Warning = 2,
        Info = 3,
        Verbose = 4
    }
    [Flags]
    public enum TraceOptions
    {
        None = 0,
        CallStack = 0x01,
        LogicalStack = 0x02,
        DateTime = 0x04,
        Timestamp = 0x08,
    }
    [Flags]
    public enum BadTraceOptions
    {
        CallStack = 0,
        LogicalStack = 0x01,
        DateTime = 0x02,
        Timestamp = 0x04,
    }
    class UseBadTraceOptions
    {
        static void MainTrace()
        {
            // Set the flags.
            BadTraceOptions badOptions =
               BadTraceOptions. LogicalStack | BadTraceOptions.Timestamp;
            // Check whether CallStack is set.
            if ((badOptions & BadTraceOptions.CallStack) ==
                BadTraceOptions.CallStack)
            {
                // This 'if' statement is always true.
            }
        }
    }
}
Imports System
Namespace ca1008
    Public Enum TraceLevel
        Off = 0
        AnError = 1
        Warning = 2
        Info = 3
        Verbose = 4
    End Enum
    <Flags>
    Public Enum TraceOptions
        None = 0
        CallStack = &h2
        LogicalStack = &h3
        DateTime = &h5
        Timestamp = &H8
    End Enum
    <Flags>
    Public Enum BadTraceOptions
        CallStack = 0
        LogicalStack = &h2
        DateTime = &h3
        Timestamp = &h5
    End Enum
    Class UseBadTraceOptions
        Shared Sub Main1008()
            ' Set the flags.
            Dim badOptions As BadTraceOptions =
            BadTraceOptions.LogicalStack Or BadTraceOptions. Timestamp
            ' Check whether CallStack is set.
            If ((badOptions And BadTraceOptions.CallStack) =
             BadTraceOptions.CallStack) Then
                ' This 'If' statement is always true.
            End If
        End Sub
    End Class
End Namespace
  • CA2217. Не помечайте перечисляемые типы с помощью FlagsAttribute
  • CA1700. Не присваивайте перечисляемым значениям имя Reserved
  • CA1712. Не добавляйте имя типа перед перечисляемыми значениями
  • CA1028. Хранилище перечисляемых типов должно относиться к типу Int32
  • CA1027. Пометьте перечисляемые типы с помощью FlagsAttribute

См. также раздел

  • System.Enum

Номенклатура комплектующих изделий, для которых устанавливается нулевое значение износа при расчете размера расходов на запасные части при восстановительном ремонте транспортных средств

Свежий номер

РГ-Неделя

Родина

Тематические приложения

Союз

Свежий номер

16. 03.2011 00:00

Поделиться

Номенклатура комплектующих изделий, для которых устанавливается нулевое значение износа при расчете размера расходов на запасные части при восстановительном ремонте транспортных средств

Дата подписания: 25.01.2011Опубликован: 16.03.2011

Вступает в силу: 27.03.2011

Зарегистрирован в Минюсте РФ 24 февраля 2011 г.

Регистрационный N 19930

Во исполнение постановления Правительства Российской Федерации от 24 мая 2010 г. N 361 «Об утверждении правил установления размера расходов на материалы и запасные части при восстановительном ремонте транспортных средств» (Собрание законодательства Российской Федерации, 2010, N 22, ст. 2774) и в целях повышения безопасности перевозки автомобильным транспортом пассажиров и грузов приказываю:

Утвердить прилагаемую Номенклатуру комплектующих изделий (деталей, узлов и агрегатов), для которых устанавливается нулевое значение износа при расчете размера расходов на запасные части при восстановительном ремонте транспортных средств.

Министр И. Левитин

Номенклатура комплектующих изделий (деталей, узлов и агрегатов), для которых устанавливается нулевое значение износа при расчете размера расходов на запасные части при восстановительном ремонте транспортных средств

1. Подушки безопасности (устройства, устанавливаемые на транспортном средстве, которые в случае удара транспортного средства автоматически раскрывают эластичный компонент, предназначенный для поглощения энергии удара посредством сжатия содержащегося в нем газа)*.

2. Ремни безопасности, включая замки крепления, устройства натяжения и ограничения усилий, детские удерживающие устройства.

3. Баллоны конденсационные пневматической системы тормозов.

4. Влагоотделители пневматической системы тормозов.

5. Воздухораспределители пневматической системы тормозов.

6. Головки соединительные пневматической системы тормозов.

7. Датчики пневматической системы тормозов.

8. Камеры тормозные пневматической системы тормозов.

9. Клапаны перепускные пневматической системы тормозов.

10. Клапаны защитные пневматической системы тормозов.

11. Клапаны ускорительные пневматической системы тормозов.

12. Клапаны управления тормозами прицепа пневматической системы тормозов.

13. Компрессоры пневматической системы тормозов.

14. Краны тормозные пневматической системы тормозов.

15. Краны разобщительные пневматической системы тормозов.

16. Краны управления тормозами прицепа пневматической системы тормозов.

17. Манометры пневматической системы тормозов.

18. Регуляторы давления пневматической системы тормозов.

19. Регуляторы тормозных сил пневматической системы тормозов.

20. Редукторы пневматической системы тормозов.

21. Ресиверы (баллоны воздушные) пневматической системы тормозов.

22. Трубопроводы пневматической системы тормозов.

23. Фильтры воздушные пневматической системы тормозов.

24. Измерительные устройства электронно-пневматических тормозных систем.

25. Электронные блоки управления электронно-пневматических тормозных систем.

26. Исполнительные механизмы электронно-пневматических тормозных систем.

27. Бачки расширительные главного тормозного цилиндра гидравлической системы тормозов.

28. Клапаны выпуска воздуха гидравлической системы тормозов.

29. Регуляторы тормозных сил гидравлической системы тормозов.

30. Насосы вакуумные гидравлической системы тормозов.

31. Трубопроводы гидравлической системы тормозов.

32. Усилители гидравлической системы тормозов.

33. Цилиндры главные тормозные гидравлической системы тормозов.

34. Цилиндры рабочие тормозные гидравлической системы тормозов.

35. Аккумуляторы давления антиблокировочной тормозной системы.

36. Блоки управления антиблокировочной тормозной системы.

37. Датчики скорости вращения колеса антиблокировочной тормозной системы.

38. Насосы антиблокировочной тормозной системы.

39. Реле гидравлического насоса антиблокировочной тормозной системы.

40. Реле магнитного клапана антиблокировочной тормозной системы.

41. Барабаны тормозные.

42. Датчики износа тормозных колодок.

43. Датчики положения педали тормоза.

44. Диски тормозные.

45. Индикаторы неисправности тормозной системы.

46. Кронштейны крепления педали тормоза.

47. Колодки тормозные.

48. Колодочный тормоз трамвая.

49. Механизмы тормозные в сборе.

50. Накладки тормозные.

51. Педали тормоза.

52. Пружины педали тормоза.

53. Пружины тормозных колодок.

54. Пылезащитные чехлы тормозной системы.

55. Регулировочные механизмы барабанного тормоза.

56. Регуляторы давления тормозной системы.

57. Рельсовый тормоз трамвая.

58. Рычаги поворотные тормозного механизма.

59. Рычаги (ручки) ручного тормоза мотоциклов.

60. Суппорты.

61. Тяги педали тормоза.

62.Аккумуляторы давления рулевого управления.

63. Бачки расширительные насоса гидроусилителя рулевого управления.

64. Валы рулевого привода.

65. Картеры рулевого механизма.

66. Клапаны управления гидравлического усилителя руля.

67. Колеса рулевые.

68. Колонки рулевого управления.

69. Кулаки поворотные рулевого управления.

70. Манжеты рулевого механизма.

71. Механизмы рулевые в сборе:

72. Наконечники рулевой тяги.

73. Насосы гидроусилителя рулевого управления.

74. Опоры промежуточные рулевого привода.

75. Радиаторы масляные гидравлического усилителя рулевого управления.

76. Распределитель рулевого усилителя.

77. Шестерни рулевого механизма.

78. Рейки рулевые.

79. Ремни насоса гидравлического усилителя руля.

80. Сошки.

81. Трубопроводы гидроусилителя рулевого управления.

82. Тяги рулевые.

83. Усилители гидравлические рулевого управления.

84. Усилители электрические рулевого управления.

85. Цилиндры силовые рулевых усилителей.

86. Шарниры рулевого управления.

87. Рули мотоциклетного типа.

88. Демпферы руля мотоциклов.

89. Тросы управления тормоза мотоциклом.

90. Брусы тяговые сцепных устройств.

91. Головки сцепные.

92. Кронштейны тяговых сцепных устройств.

93. Крюки запорные сцепных устройств.

94. Опорно-сцепные устройства.

95. Подушки резиновые сцепных устройств.

96. Пружины сцепных устройств.

97.Сцепные устройства крючкового типа.

98. Тяги сцепные.

99. Фланцы соединительные сцепных устройств.

100. Шаровые наконечники сцепных устройств.

101. Шкворни сцепные.

102. Сцепные устройства трамвая.

* Пункт 5 Технического регламента о безопасности колесных транспортных средств, утвержденного Постановлением Правительства Российской Федерации от 10.09.2009 года N 720 (Собрание законодательства РФ, 21.09.2009, N 38, ст. 4475; 20.09.2010, N 38, ст. 4828).

Российская газета — Федеральный выпуск: №54(5430)

Поделиться

  • Приказ Министерства сельского хозяйства Российской Федерации, Министерства транспорта Российской Федерации от 20. 03.2023 № 127/87 «Об утверждении норм естественной убыли масел растительных и фракций масел растительных при перевозках морским и железнодорожным транспортом, норм естественной убыли семян льна и конопли, горчичного порошка при перевозках железнодорожным транспортом и норм естественной убыли грузов пищевой масложировой продукции, жмыхов при перевозках внутренним водным транспортом»
  • Приказ Министерства финансов Российской Федерации от 27.03.2023 № 32н «О признании утратившими силу приказа Министерства финансов Российской Федерации от 8 июня 2021 г. № 75н «Об утверждении кодов (перечней кодов) бюджетной классификации Российской Федерации на 2022 год (на 2022 год и на плановый период 2023 и 2024 годов)» и внесенных в него изменений»

Что такое нулевое значение и почему оно полезно?

Начнем со спецификации языка Go с нулевого значения.

Когда память выделяется для хранения значения либо с помощью объявления, либо с помощью вызова make или new и не предоставляется явная инициализация, память получает инициализацию по умолчанию. Каждому элементу такого значения присваивается нулевое значение для его типа: false для логических значений, 0 для целых чисел, 0.0  для чисел с плавающей запятой, ""  для строк и nil  для указателей, функций, интерфейсов, срезов, каналов и карт. Эта инициализация выполняется рекурсивно, поэтому, например, поля каждого элемента массива структур будут обнулены, если значение не указано.

Это свойство всегда устанавливать известное значение по умолчанию важно для безопасности и правильности вашей программы, но также может сделать ваши программы Go проще и компактнее. Вот о чем говорят программисты Go, когда говорят «придайте своим структурам полезное нулевое значение» .

Вот пример использования sync.Mutex , который предназначен для использования без явной инициализации. sync.Mutex содержит два неэкспортированных целочисленных поля. Благодаря нулевому значению для этих полей будет установлено значение 0 всякий раз, когда объявляется sync. Mutex .

 пакет основной
импортировать "синхронизацию"
введите структуру MyInt {
        мю sync.Mutex
        значение целое
}
основная функция () {
        переменная MyInt
        // i.mu можно использовать без явной инициализации.
        i.mu.Lock()
        i.val++
        i.mu.Разблокировать()
} 

Другой пример типа с полезным нулевым значением составляет байт. Буфер . Вы можете записать байт. Буфер и начать Чтение или Запись без явной инициализации. Обратите внимание, что io.Copy принимает io.Reader в качестве второго аргумента, поэтому нам нужно передать указатель на b .

 пакет основной
импортировать "байты"
импортировать "ио"
импортировать "ОС"
основная функция () {
        var b bytes.Buffer
        b.Write([]byte("Привет, мир"))
        io.Copy(os.Stdout, &b)
} 

Полезным свойством слайсов является их нулевое значение равно nil . Это означает, что вам не нужно явно делать слайсом, вы можете просто объявить его.

 пакет основной
импортировать "фмт"
импортировать "строки"
основная функция () {
        // s := make([]string, 0)
        // с := []строка{}
        переменная [] строка
        s = добавить (s, "Привет")
        s = добавить (s, "мир")
        fmt.Println(strings.Join(s, ""))
} 

Примечание: var s []string аналогична  на две строки с комментариями над ним, но не идентичные. Можно обнаружить разницу между значением среза, равным nil , и значением среза, имеющим нулевую длину . Следующий код выведет false .

 пакет основной
импортировать "фмт"
импортировать "отражать"
основная функция () {
        переменная s1 = []строка{}
        переменная s2 [] строка
        fmt.Println(отражать.DeepEqual(s1, s2))
} 

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

 основной пакет
импортировать "фмт"
введите структуру конфигурации {
        строка пути
}
func (c *Config) Путь () строка {
        если с == ноль {
                вернуть "/usr/домой"
        }
        вернуть c.path
}
основная функция () {
        переменная c1 *Конфигурация
        переменная c2 = &конфигурация{
                путь: "/экспорт",
        }
        fmt.Println(c1.Path(), c2.Path())
} 

Выражаем благодарность Яну Мерклу, Дугу Ландауэру, Стефану Нильссону и Роджеру Пеппе из замечательного сообщества Go+ за их отзывы и предложения.

Значение нуля. Многие думают о нуле как о числе… | Джеки Очола | The Andela Way

Андельцы определяют и увеличивают нули

Многие люди считают ноль числом, которое ничего не обозначает или не имеет значения. Для философа, возможно, нуля не существует. А при цифровой передаче две двоичные цифры, ноль и единица, используются для представления всей информации во всем мире. Проще говоря, можно сказать, что ноль может представлять половину мира. Другие считают ноль отправной точкой, а пословицу «, начиная с нуля, вам нечего терять», — быстро приходит на ум . Я нахожу этот позитивный взгляд на понимание нуля весьма привлекательным, поскольку он отражает суть оптимизма. Лауреат Нобелевской премии по психологии Дэниел Канеман в своей широко известной книге « Thinking Fast and Slow , » заявил, что оптимизм — это явное жизненное преимущество, которым одни люди обладают над другими.

Исходя из этой мысли, в жизни есть бесчисленное множество вещей, которые можно рассматривать как ничто. Можно ошибочно предположить, что они не имеют никакой ценности, пока не будет проведен более тщательный анализ. Деньги дают нам очень близкий пример. Нулевой остаток на банковском счете означает, что на моем счете нет денег. Это также означает, что я не должен денег банку. С другой стороны, если предположить, что у меня есть миллион долларов и к моему банковскому балансу добавлен седьмой ноль, то один дополнительный ноль внезапно умножит сумму моих денег в несколько раз.

Будучи приверженцем мелких деталей, я часто спрашивал своих коллег, как бы они себя чувствовали, если бы в их зарплате не было всего одного нуля в конце суммы. Излишне говорить, что эта мысль была непостижимой, если не полностью отвергнутой как невозможная. С другой стороны, мне говорят, что если бы я заплатил сумму денег с лишним нулем в конце суммы, то я был бы просто дураком, заслуживающим самого сурового наказания. Любая попытка сопоставить важность внимания к деталям во всех аспектах жизни с аналогией с зарплатой часто наталкивается на поразительное утверждение, что с деньгами дело обстоит иначе. Осознание, которое, кажется, распутывается, состоит в том, что ноль сам по себе может казаться не имеющим ценности. Однако при добавлении к чему-либо еще ноль увеличивает ценность этой вещи во много раз. И наоборот, отсутствие нуля значительно уменьшило бы его значение.

На недавнем мероприятии, посвященном выпуску электронной книги Vumbula React , соавторами которой являются два старших разработчика Andela, Джон Кагга и Эдмонд Атто, говорилось о важности технического письма.