CA1028: хранилище перечислений должно иметь тип Int32
Свойство | Значение |
---|---|
Идентификатор правила | CA1028 |
Заголовок | Хранилище перечисляемых типов должно относиться к типу Int32 |
Категория | Проектирование |
Исправление является критическим или не критическим | Критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Базовый типа для перечисления не System.Int32.
По умолчанию это правило проверяет только видимые извне перечисления, но это поведение можно настроить.
Описание правила
Перечисление является типом значения, которое определяет набор связанных именованных констант. По умолчанию для хранения значений констант используется тип данных System.Int32. Этот базовый тип можно изменить, но в большинстве случаев это не нужно или не рекомендуется. За счет использования типа данных меньше Int32 не удается достичь заметного выигрыша в производительности. Если вы не можете использовать тип данных по умолчанию, следует выбрать один из целочисленных типов, совместимых с CLS, — Byte, Int16, Int32 или Int64. Это позволяет гарантировать, что все значения перечисления могут быть представлены в языках программирования, совместимых с CLS.
Устранение нарушений
Если не существует проблем с размером или совместимостью, используйте Int32, чтобы устранить это нарушение. Если Int32 недостаточно велик для хранения значений, используйте Int64. Если для обратной совместимости требуется тип данных меньшего размера, используйте Byte или Int16.
Когда лучше отключить предупреждения
Отменяйте предупреждение из этого правила только в том случае, если это требуется для устранения проблем с обратной совместимостью. В приложениях несоответствие этому правилу обычно не вызывает проблем. В библиотеках, где требуется языковая совместимость, несоблюдение этого правила может негативно сказаться на работе пользователей.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1028
// The code that's violating the rule is on this line.
#pragma warning restore CA1028
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1028.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (конструкторе), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включение определенных контактных зон API
Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Заметка
Замените XXXX
частью CAXXXX
идентификатором применимого правила.
Пример
В следующем примере показаны два перечисления, которые не используют рекомендуемый базовый тип данных.
[Flags]
public enum Days : uint
{
None = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
All = Monday | Tuesday | Wednesday | Thursday | Friday
}
public enum Color : sbyte
{
None = 0,
Red = 1,
Orange = 3,
Yellow = 4
}
<Flags()>
Public Enum Days As UInteger
None = 0
Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
Friday = 16
All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
End Enum
Public Enum Color As SByte
None = 0
Red = 1
Orange = 3
Yellow = 4
End Enum
Следующий пример устраняет предыдущее нарушение, изменяя базовый тип данных на Int32.
[Flags]
public enum Days : int
{
None = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
All = Monday | Tuesday | Wednesday | Thursday | Friday
}
public enum Color : int
{
None = 0,
Red = 1,
Orange = 3,
Yellow = 4
}
<Flags()>
Public Enum Days As Integer
None = 0
Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
Friday = 16
All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
End Enum
Public Enum Color As Integer
None = 0
Red = 1
Orange = 3
Yellow = 4
End Enum
Связанные правила
- CA1008: перечисляемые типы должны иметь нулевое значение
- CA1027: следует помечать перечисления атрибутом FlagsAttribute
- CA2217: не следует помечать перечисления атрибутом FlagsAttribute
- CA1700: не следует называть значения перечислений именем "Reserved"
- CA1712: не добавляйте имя типа перед перечисляемыми значениями