Поделиться через


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: не добавляйте имя типа перед перечисляемыми значениями

См. также

Ссылки

System.Byte

System.Int16

System.Int32

System.Int64