CA1028: хранилище перечислений должно иметь тип Int32
TypeName |
EnumStorageShouldBeInt32 |
CheckId |
CA1028 |
Категория |
Microsoft.Design |
Критическое изменение |
Критическое изменение |
Причина
Базовый тип открытого перечисления отличен от System.Int32.
Описание правила
Перечисление является типом значения, которое определяет набор связанных именованных констант. По умолчанию для хранения значения константы используется тип данных System.Int32. Этот базовый тип можно изменить, но этого не требуется и в большинстве случаев это не рекомендуется. Обратите внимание, что при использовании более мелкого типа данных, чем Int32, прирост производительности весьма незначителен. Если невозможно использовать тип данных по умолчанию, следует использовать один из встроенных типов, совместимых с CLS (Byte, Int16, Int32 или Int64), чтобы убедиться, что все значения перечисления могут быть представлены на языках программирования, совместимых с CLS.
Устранение нарушений
Чтобы устранить нарушение этого правила, используйте тип Int32, если не возникают проблемы с размером или совместимостью. В случаях, когда размер Int32 недостаточен для хранения значений, используйте Int64. Если в целях обратной совместимости требуется более мелкий тип данных, используйте Byte или Int16.
Отключение предупреждений
Предупреждения этого правила можно отключать только в случае, если другой тип данных используется в целях обратной совместимости. В приложениях обычно не возникает проблем из-за нарушения этого правила. В библиотеках, где требуется обеспечить взаимодействие языков, нарушение этого правила может затруднить работу пользователей.
Пример нарушения
Описание
В следующем примере показаны два перечисления, не использующие рекомендованный базовый тип данных.
Код
Imports System
Namespace Samples
<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
End Namespace
using System;
namespace DesignLibrary
{
[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
}
}
Пример исправления нарушения
Описание
В следующем примере нарушение устраняется путем изменения базового типа данных на Int32.
Код
Imports System
Namespace Samples
<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
End Namespace
using System;
namespace Samples
{
[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
}
}
Связанные правила
CA1008: перечисляемые типы должны иметь нулевое значение
CA1027: следует помечать перечисления атрибутом FlagsAttribute
CA2217: не следует помечать перечисления атрибутом FlagsAttribute
CA1700: не следует называть значения перечислений именем "Reserved"
CA1712: не добавляйте имя типа перед перечисляемыми значениями