Enum Класс

Определение

Предоставляет базовый класс для перечислений.

public ref class Enum abstract : ValueType, IComparable, IConvertible, IFormattable
public ref class Enum abstract : ValueType, IComparable, IFormattable
public abstract class Enum : ValueType, IComparable, IConvertible, IFormattable
[System.Serializable]
public abstract class Enum : ValueType, IComparable, IConvertible, IFormattable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Enum : ValueType, IComparable, IConvertible, IFormattable
public abstract class Enum : ValueType, IComparable, IFormattable
type Enum = class
    inherit ValueType
    interface IComparable
    interface IConvertible
    interface IFormattable
[<System.Serializable>]
type Enum = class
    inherit ValueType
    interface IComparable
    interface IFormattable
    interface IConvertible
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Enum = class
    inherit ValueType
    interface IComparable
    interface IFormattable
    interface IConvertible
type Enum = class
    inherit ValueType
    interface IComparable
    interface IFormattable
Public MustInherit Class Enum
Inherits ValueType
Implements IComparable, IConvertible, IFormattable
Public MustInherit Class Enum
Inherits ValueType
Implements IComparable, IFormattable
Наследование
Производный
Атрибуты
Реализации

Примеры

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

using namespace System;
enum class Days
{
   Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
};

enum class BoilingPoints
{
   Celsius = 100,
   Fahrenheit = 212
};

[Flags]

enum class Colors
{
   Red = 1,
   Green = 2,
   Blue = 4,
   Yellow = 8
};

int main()
{
   Type^ weekdays = Days::typeid;
   Type^ boiling = BoilingPoints::typeid;
   Console::WriteLine(  "The days of the week, and their corresponding values in the Days Enum are:" );
   Array^ a = Enum::GetNames( weekdays );
   Int32 i = 0;
   do
   {
      Object^ o = a->GetValue( i );
      Console::WriteLine(  "{0,-11}= {1}", o->ToString(), Enum::Format( weekdays, Enum::Parse( weekdays, o->ToString() ),  "d" ) );
   }
   while ( ++i < a->Length );

   Console::WriteLine();
   Console::WriteLine(  "Enums can also be created which have values that represent some meaningful amount." );
   Console::WriteLine(  "The BoilingPoints Enum defines the following items, and corresponding values:" );
   i = 0;
   Array^ b = Enum::GetNames( boiling );
   do
   {
      Object^ o = b->GetValue( i );
      Console::WriteLine(  "{0,-11}= {1}", o->ToString(), Enum::Format( boiling, Enum::Parse( boiling, o->ToString() ),  "d" ) );
   }
   while ( ++i < b->Length );

   Array^ c = Enum::GetNames( Colors::typeid );
   Colors myColors = Colors::Red | Colors::Blue | Colors::Yellow;
   Console::WriteLine();
   Console::Write(  "myColors holds a combination of colors. Namely:" );
   for ( i = 0; i < 3; i++ )
      Console::Write(  " {0}", c->GetValue( i ) );
}
using System;

public class EnumTest {
    enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
    enum BoilingPoints { Celsius = 100, Fahrenheit = 212 };
    [Flags]
    enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };

    public static void Main() {

        Type weekdays = typeof(Days);
        Type boiling = typeof(BoilingPoints);

        Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:");

        foreach ( string s in Enum.GetNames(weekdays) )
            Console.WriteLine( "{0,-11}= {1}", s, Enum.Format( weekdays, Enum.Parse(weekdays, s), "d"));

        Console.WriteLine();
        Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.");
        Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:");

        foreach ( string s in Enum.GetNames(boiling) )
            Console.WriteLine( "{0,-11}= {1}", s, Enum.Format(boiling, Enum.Parse(boiling, s), "d"));

        Colors myColors = Colors.Red | Colors.Blue | Colors.Yellow;
        Console.WriteLine();
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors);
    }
}
Public Class EnumTest
    Enum Days
        Saturday
        Sunday
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
    End Enum 
    
    Enum BoilingPoints
        Celsius = 100
        Fahrenheit = 212
    End Enum 
    
    <Flags()> _
    Enum Colors
        Red = 1
        Green = 2
        Blue = 4
        Yellow = 8
    End Enum 

    Public Shared Sub Main()
        Dim weekdays As Type = GetType(Days)
        Dim boiling As Type = GetType(BoilingPoints)

        Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:")

        Dim s As String
        For Each s In  [Enum].GetNames(weekdays)
            Console.WriteLine("{0,-11} = {1}", s, [Enum].Format(weekdays, [Enum].Parse(weekdays, s), "d"))
        
        Next s
        Console.WriteLine()
        Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.")
        Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:")

        For Each s In  [Enum].GetNames(boiling)
            Console.WriteLine("{0,-11} = {1}", s, [Enum].Format(boiling, [Enum].Parse(boiling, s), "d"))
        Next s

        Dim myColors As Colors = Colors.Red Or Colors.Blue Or Colors.Yellow
        Console.WriteLine()
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors)
    End Sub 
End Class

Комментарии

Перечисление — это набор именованных констант, базовый тип которых имеет любой целочисленный тип. Если базовый тип не объявлен явно, Int32 используется. Enumявляется базовым классом для всех перечислений в платформа .NET Framework. Типы перечисления определяются enum ключевым словом в C# и Enum конструкцией... End Enum в Visual Basic.

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

Кроме того, перечисление можно рассматривать как битовое поле. Дополнительные сведения см. в разделе Неисключительные члены и раздел атрибутов flags и в FlagsAttribute разделе.

В этом разделе.

Создание типа перечисления
Создание экземпляра типа перечисления
Рекомендации по перечислению
Выполнение операций с перечислениями
Выполнение преобразований
Синтаксический анализ значений перечисления
Форматирование значений перечисления
Перебор членов перечисления
Неисключительные члены и атрибут Flags
Добавление методов перечисления

Создание типа перечисления

Языки программирования обычно предоставляют синтаксис для объявления перечисления, состоящего из набора именованных констант и их значений. в следующем примере показан синтаксис, используемый C# и Visual Basic для определения перечисления. Он создает перечисление с именем ArrivalStatus , которое имеет три члена: ArrivalStatus.Early , ArrivalStatus.OnTime и ArrivalStatus.Late . Обратите внимание, что в обоих случаях перечисление не наследуется явным образом Enum . отношение наследования обрабатывается компилятором неявно.

public enum ArrivalStatus { Late=-1, OnTime=0, Early=1 };
Public Enum ArrivalStatus As Integer
   Late = -1
   OnTime = 0
   Early = 1
End Enum

Предупреждение

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

Создание экземпляра типа перечисления

Можно создать экземпляр типа перечисления так же, как и любой другой тип значения: путем объявления переменной и присвоения ей одной из констант перечисления. В следующем примере создается экземпляр со ArrivalStatus значением ArrivalStatus.OnTime .

public class Example
{
   public static void Main()
   {
      ArrivalStatus status = ArrivalStatus.OnTime;
      Console.WriteLine("Arrival Status: {0} ({0:D})", status);
   }
}
// The example displays the following output:
//       Arrival Status: OnTime (0)
Public Module Example
   Public Sub Main()
      Dim status As ArrivalStatus = ArrivalStatus.OnTime
      Console.WriteLine("Arrival Status: {0} ({0:D})", status)
   End Sub
End Module
' The example displays the following output:
'        Arrival Status: OnTime (0)

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

  • используя определенные функции языка программирования для приведения (как в C#) или convert (как в Visual Basic) целочисленное значение со значением перечисления. В следующем примере создается ArrivalStatus объект, значение которого является ArrivalStatus.Early таким образом.

    ArrivalStatus status2 = (ArrivalStatus) 1;
    Console.WriteLine("Arrival Status: {0} ({0:D})", status2);
    // The example displays the following output:
    //       Arrival Status: Early (1)
    
    Dim status2 As ArrivalStatus = CType(1, ArrivalStatus)
    Console.WriteLine("Arrival Status: {0} ({0:D})", status2)
    ' The example displays the following output:
    '       Arrival Status: Early (1)
    
  • Путем вызова его неявного конструктора без параметров. Как показано в следующем примере, в данном случае базовое значение экземпляра перечисления равно 0. Однако это не обязательно значение допустимой константы в перечислении.

    ArrivalStatus status1 = new ArrivalStatus();
    Console.WriteLine("Arrival Status: {0} ({0:D})", status1);
    // The example displays the following output:
    //       Arrival Status: OnTime (0)
    
    Dim status1 As New ArrivalStatus()
    Console.WriteLine("Arrival Status: {0} ({0:D})", status1)
    ' The example displays the following output:
    '        Arrival Status: OnTime (0)
    
  • Путем вызова Parse метода или TryParse для синтаксического анализа строки, содержащей имя константы в перечислении. Дополнительные сведения см. в разделе анализ значений перечисления .

  • Путем вызова ToObject метода для преобразования целочисленного значения в тип перечисления. Дополнительные сведения см. в разделе выполнение преобразований .

Рекомендации по перечислению

При определении типов перечислений рекомендуется использовать следующие рекомендации:

  • Если вы не определили член перечисления, значение которого равно 0, рассмотрите возможность создания None перечислимой константы. По умолчанию память, используемая для перечисления, инициализируется средой CLR равным нулю. Следовательно, если не определить константу, значение которой равно нулю, то при создании перечисление будет содержать недопустимое значение.

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

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

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

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

Выполнение операций с перечислениями

При создании перечисления нельзя определять новые методы. Однако тип перечисления наследует полный набор статических методов и экземпляров Enum класса. В следующих разделах рассматриваются большинство этих методов, а также несколько других методов, которые обычно используются при работе со значениями перечисления.

Выполнение преобразований

преобразование между членом перечисления и его базовым типом можно выполнить с помощью оператора приведения (в C#) или преобразования (в Visual Basic). В следующем примере операторы приведения или преобразования используются для выполнения преобразований из целого числа в значение перечисления и из значения перечисления в целое число.

int value3 = 2;
ArrivalStatus status3 = (ArrivalStatus) value3;

int value4 = (int) status3;
Dim value3 As Integer = 2
Dim status3 As ArrivalStatus = CType(value3, ArrivalStatus)

Dim value4 As Integer = CInt(status3)

EnumКласс также включает ToObject метод, который преобразует значение любого целочисленного типа в значение перечисления. В следующем примере метод используется ToObject(Type, Int32) для преобразования Int32 в ArrivalStatus значение. Обратите внимание, что, поскольку ToObject возвращает значение типа Object , использование оператора приведения или преобразования по-прежнему может потребоваться для приведения объекта к типу перечисления.

int number = -1;
ArrivalStatus arrived = (ArrivalStatus) ArrivalStatus.ToObject(typeof(ArrivalStatus), number);
Dim number As Integer = -1
Dim arrived As ArrivalStatus = CType(ArrivalStatus.ToObject(GetType(ArrivalStatus), number), ArrivalStatus)

При преобразовании целого числа в значение перечисления можно присвоить значение, которое не является членом перечисления. Чтобы избежать этого, перед выполнением преобразования можно передать целое число в IsDefined метод. В следующем примере этот метод используется для определения того, можно ли преобразовать элементы массива целочисленных значений в ArrivalStatus значения.

using System;

public enum ArrivalStatus { Unknown=-3, Late=-1, OnTime=0, Early=1 };

public class Example
{
   public static void Main()
   {
      int[] values = { -3, -1, 0, 1, 5, Int32.MaxValue };
      foreach (var value in values)
      {
         ArrivalStatus status;
         if (Enum.IsDefined(typeof(ArrivalStatus), value))
            status = (ArrivalStatus) value;
         else
            status = ArrivalStatus.Unknown;
         Console.WriteLine("Converted {0:N0} to {1}", value, status);
      }
   }
}
// The example displays the following output:
//       Converted -3 to Unknown
//       Converted -1 to Late
//       Converted 0 to OnTime
//       Converted 1 to Early
//       Converted 5 to Unknown
//       Converted 2,147,483,647 to Unknown
Public Enum ArrivalStatus As Integer
   Unknown = -3
   Late = -1
   OnTime = 0
   Early = 1
End Enum

Module Example
   Public Sub Main()
      Dim values() As Integer = { -3, -1, 0, 1, 5, Int32.MaxValue }
      For Each value In values
         Dim status As ArrivalStatus
         If [Enum].IsDefined(GetType(ArrivalStatus), value)
            status = CType(value, ArrivalStatus) 
         Else
            status = ArrivalStatus.Unknown
         End If
         Console.WriteLine("Converted {0:N0} to {1}", value, status)
      Next   
   End Sub
End Module
' The example displays the following output:
'       Converted -3 to Unknown
'       Converted -1 to Late
'       Converted 0 to OnTime
'       Converted 1 to Early
'       Converted 5 to Unknown
'       Converted 2,147,483,647 to Unknown

Хотя Enum класс предоставляет явные реализации интерфейса IConvertible для преобразования значения перечисления в целочисленный тип, Convert ToInt32 для выполнения этих преобразований следует использовать методы класса, например. В следующем примере показано, как можно использовать GetUnderlyingType метод вместе с Convert.ChangeType методом для преобразования значения перечисления в его базовый тип. Обратите внимание, что в этом примере не требуется, чтобы базовый тип перечисления был известен во время компиляции.

ArrivalStatus status = ArrivalStatus.Early;
var number = Convert.ChangeType(status, Enum.GetUnderlyingType(typeof(ArrivalStatus)));
Console.WriteLine("Converted {0} to {1}", status, number);
// The example displays the following output:
//       Converted Early to 1
Dim status As ArrivalStatus = ArrivalStatus.Early
Dim number = Convert.ChangeType(status, [Enum].GetUnderlyingType(GetType(ArrivalStatus)))
Console.WriteLine("Converted {0} to {1}", status, number)
' The example displays the following output:
'       Converted Early to 1

Синтаксический анализ значений перечисления

ParseМетоды и TryParse позволяют преобразовать строковое представление значения перечисления в это значение. Строковое представление может быть либо именем, либо базовым значением константы перечисления. Обратите внимание, что методы синтаксического анализа будут успешно преобразовывать строковые представления чисел, которые не являются элементами определенного перечисления, если строки можно преобразовать в значение базового типа перечисления. Чтобы избежать этого, IsDefined можно вызвать метод, чтобы убедиться, что результат метода анализа является допустимым значением перечисления. Пример иллюстрирует этот подход и демонстрирует вызовы Parse(Type, String) Enum.TryParse<TEnum>(String, TEnum) методов и. обратите внимание, что неуниверсальный метод синтаксического анализа возвращает объект, который может потребоваться привести (в C#) или преобразовать (в Visual Basic) к соответствующему типу перечисления.

string number = "-1";
string name = "Early";

try {
   ArrivalStatus status1 = (ArrivalStatus) Enum.Parse(typeof(ArrivalStatus), number);
   if (!(Enum.IsDefined(typeof(ArrivalStatus), status1)))
      status1 = ArrivalStatus.Unknown;
   Console.WriteLine("Converted '{0}' to {1}", number, status1);
}
catch (FormatException) {
   Console.WriteLine("Unable to convert '{0}' to an ArrivalStatus value.",
                     number);
}

ArrivalStatus status2;
if (Enum.TryParse<ArrivalStatus>(name, out status2)) {
   if (!(Enum.IsDefined(typeof(ArrivalStatus), status2)))
      status2 = ArrivalStatus.Unknown;
   Console.WriteLine("Converted '{0}' to {1}", name, status2);
}
else {
   Console.WriteLine("Unable to convert '{0}' to an ArrivalStatus value.",
                     number);
}
// The example displays the following output:
//       Converted '-1' to Late
//       Converted 'Early' to Early
Dim number As String = "-1"
Dim name As String = "Early"
Dim invalid As String = "32"

Try 
   Dim status1 As ArrivalStatus = CType([Enum].Parse(GetType(ArrivalStatus), number), ArrivalStatus)
   If Not [Enum].IsDefined(GetType(ArrivalStatus), status1) Then status1 = ArrivalStatus.Unknown
   Console.WriteLine("Converted '{0}' to {1}", number, status1)
Catch e As FormatException
   Console.WriteLine("Unable to convert '{0}' to an ArrivalStatus value.", 
                     number)
End Try   
   
Dim status2 As ArrivalStatus
If [Enum].TryParse(Of ArrivalStatus)(name, status2) Then
   If Not [Enum].IsDefined(GetType(ArrivalStatus), status2) Then status2 = ArrivalStatus.Unknown
   Console.WriteLine("Converted '{0}' to {1}", name, status2)
Else
   Console.WriteLine("Unable to convert '{0}' to an ArrivalStatus value.", 
                     number)
End If
' The example displays the following output:
'       Converted '-1' to Late
'       Converted 'Early' to Early

Форматирование значений перечисления

Можно преобразовать значения перечисления в их строковые представления, вызвав статический Format метод, а также перегрузки ToString метода экземпляра. Строку формата можно использовать для управления точным способом представления значения перечисления в виде строки. Дополнительные сведения см. в разделе строки формата перечисления. В следующем примере используется каждая из поддерживаемых строк формата перечисления ("G" или "g", "D" или "d", "X" или "x", "F" или "f") для преобразования члена ArrivalStatus перечисления в его строковые представления.

string[] formats= { "G", "F", "D", "X"};
ArrivalStatus status = ArrivalStatus.Late;
foreach (var fmt in formats)
   Console.WriteLine(status.ToString(fmt));

// The example displays the following output:
//       Late
//       Late
//       -1
//       FFFFFFFF
Dim formats() As String = { "G", "F", "D", "X"}
Dim status As ArrivalStatus = ArrivalStatus.Late
For Each fmt As String In formats
   Console.WriteLine(status.ToString(fmt))
Next
' The example displays the following output:
'       Late
'       Late
'       -1
'       FFFFFFFF

Перебор членов перечисления

Enumтип не реализует IEnumerable IEnumerable<T> интерфейс или, который позволяет выполнять итерацию элементов коллекции с помощью foreach конструкции (в C#) или For Each (в Visual Basic). Однако можно перечислить элементы одним из двух способов.

  • Можно вызвать метод, GetNames чтобы получить массив строк, содержащий имена членов перечисления. Затем для каждого элемента массива строк можно вызвать Parse метод, чтобы преобразовать строку в ее эквивалентное значение перечисления. Этот подход показан в приведенном ниже примере.

    string[] names = Enum.GetNames(typeof(ArrivalStatus));
    Console.WriteLine("Members of {0}:", typeof(ArrivalStatus).Name);
    Array.Sort(names);
    foreach (var name in names) {
       ArrivalStatus status = (ArrivalStatus) Enum.Parse(typeof(ArrivalStatus), name);
       Console.WriteLine("   {0} ({0:D})", status);
    }
    // The example displays the following output:
    //       Members of ArrivalStatus:
    //          Early (1)
    //          Late (-1)
    //          OnTime (0)
    //          Unknown (-3)
    
    Dim names() As String = [Enum].GetNames(GetType(ArrivalStatus))
    Console.WriteLine("Members of {0}:", GetType(ArrivalStatus).Name)
    Array.Sort(names)
    For Each name In names
       Dim status As ArrivalStatus = CType([Enum].Parse(GetType(ArrivalStatus), name),
                                     ArrivalStatus)
       Console.WriteLine("   {0} ({0:D})", status)
    Next
    ' The example displays the following output:
    '       Members of ArrivalStatus:
    '          Early (1)
    '          Late (-1)
    '          OnTime (0)
    '          Unknown (-3)
    
  • Метод можно вызвать GetValues для получения массива, содержащего базовые значения в перечислении. Затем для каждого элемента массива можно вызвать ToObject метод для преобразования целого числа в эквивалентное ему значение перечисления. Этот подход показан в приведенном ниже примере.

    var values = Enum.GetValues(typeof(ArrivalStatus));
    Console.WriteLine("Members of {0}:", typeof(ArrivalStatus).Name);
    foreach (ArrivalStatus status in values) {
       Console.WriteLine("   {0} ({0:D})", status);
    }
    // The example displays the following output:
    //       Members of ArrivalStatus:
    //          OnTime (0)
    //          Early (1)
    //          Unknown (-3)
    //          Late (-1)
    
    Dim values = [Enum].GetValues(GetType(ArrivalStatus))
    Console.WriteLine("Members of {0}:", GetType(ArrivalStatus).Name)
    For Each value In values
       Dim status As ArrivalStatus = CType([Enum].ToObject(GetType(ArrivalStatus), value),
                                           ArrivalStatus)
       Console.WriteLine("   {0} ({0:D})", status)
    Next                                       
    ' The example displays the following output:
    '       Members of ArrivalStatus:
    '          OnTime (0)
    '          Early (1)
    '          Unknown (-3)
    '          Late (-1)
    

Неисключительные члены и атрибут Flags

Одним из распространенных способов использования перечисления является представление набора взаимно исключающих значений. Например, ArrivalStatus экземпляр может иметь значение Early , OnTime или Late . Не имеет смысла, ArrivalStatus чтобы значение экземпляра отражало более одной константы перечисления.

Однако в других случаях значение объекта перечисления может включать несколько членов перечисления, а каждый элемент представляет битовое поле в значении перечисления. FlagsAttributeАтрибут можно использовать, чтобы указать, что перечисление состоит из битовых полей. Например, перечисление с именем Pets может использоваться для указания видов Pets в семье. Его можно определить следующим образом.

[Flags] public enum Pets { None=0, Dog=1, Cat=2, Bird=4, Rodent=8,
                           Reptile=16, Other=32 };
<Flags> Public Enum Pets As Integer
   None = 0
   Dog = 1
   Cat = 2
   Bird = 4
   Rodent = 8
   Reptile = 16
   Other = 32
End Enum

PetsЗатем можно использовать перечисление, как показано в следующем примере.

Pets familyPets = Pets.Dog | Pets.Cat;
Console.WriteLine("Pets: {0:G} ({0:D})", familyPets);
// The example displays the following output:
//       Pets: Dog, Cat (3)
Dim familyPets As Pets = Pets.Dog Or Pets.Cat
Console.WriteLine("Pets: {0:G} ({0:D})", familyPets)
' The example displays the following output:
'       Pets: Dog, Cat (3)

При определении побитового перечисления и применении атрибута следует использовать следующие рекомендации FlagsAttribute .

  • Используйте FlagsAttribute настраиваемый атрибут для перечисления, только если для числового значения требуется выполнить побитовую операцию (and, OR, исключающее или).

  • Определите константы перечисления в степени двойки, то есть 1, 2, 4, 8 и т. д. Это означает, что отдельные флаги в Объединенных константах перечисления не перекрываются.

  • Рассмотрите возможность создания перечислимой константы для часто используемых сочетаний флагов. Например, если имеется перечисление, используемое для операций файлового ввода-вывода, содержащих перечислимые константы Read = 1 и Write = 2 , рассмотрите возможность создания перечислимой константы ReadWrite = Read OR Write , объединяющей Read Write флаги и. Кроме того, побитовая операция OR, используемая для объединения флагов, может рассматриваться как расширенная концепция в некоторых обстоятельствах, которая не должна требоваться для простых задач.

  • Будьте внимательны при определении отрицательного числа в виде перечислимой константы, так как для множества положений флагов может быть задано значение 1, что может сделать код запутанным и рекомендовать ошибки кода.

  • Чтобы проверить, установлен ли флаг в числовом значении, нужно вызвать HasFlag метод экземпляра, как показано в следующем примере.

    Pets familyPets = Pets.Dog | Pets.Cat;
    if (familyPets.HasFlag(Pets.Dog))
       Console.WriteLine("The family has a dog.");
    // The example displays the following output:
    //       The family has a dog.
    
    Dim familyPets As Pets = Pets.Dog Or Pets.Cat
    If familyPets.HasFlag(Pets.Dog) Then
       Console.WriteLine("The family has a dog.")
    End If
    ' The example displays the following output:
    '       The family has a dog.
    

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

    Pets familyPets = Pets.Dog | Pets.Cat;
    if ((familyPets & Pets.Dog) == Pets.Dog)
       Console.WriteLine("The family has a dog.");
    // The example displays the following output:
    //       The family has a dog.
    
    Dim familyPets As Pets = Pets.Dog Or Pets.Cat
    If familyPets And Pets.Dog = Pets.Dog Then
       Console.WriteLine("The family has a dog.")
    End If   
    ' The example displays the following output:
    '       The family has a dog.
    
  • Используйте None в качестве имени константы с перечислимым флагом, значение которой равно нулю. Нельзя использовать None перечислимую константу в побитовой операции и для проверки флага, так как результат всегда равен нулю. Однако можно выполнить логическое, а не побитовое сравнение числового значения и None перечислимой константы, чтобы определить, заданы ли какие-либо биты из числового значения. Это продемонстрировано в следующем примере.

    Pets familyPets = Pets.Dog | Pets.Cat;
    if (familyPets == Pets.None)
       Console.WriteLine("The family has no pets.");
    else
       Console.WriteLine("The family has pets.");
    // The example displays the following output:
    //       The family has pets.
    
    Dim familyPets As Pets = Pets.Dog Or Pets.Cat
    If familyPets = Pets.None Then
       Console.WriteLine("The family has no pets.")
    Else
       Console.WriteLine("The family has pets.")   
    End If
    ' The example displays the following output:
    '       The family has pets.
    
  • Не определяйте значение перечисления исключительно для отражения состояния самого перечисления. Например, не определяйте константу перечисления, которая только отмечает конец перечисления. Если необходимо определить Последнее значение перечисления, проверьте это значение явным образом. Кроме того, можно выполнить проверку диапазона для первой и последней перечислимой константы, если все значения в диапазоне допустимы.

Добавление методов перечисления

поскольку типы перечислений определяются языковой структурой, например enum (C#) и Enum (Visual Basic), нельзя определить пользовательские методы для типа перечисления, отличного от методов, унаследованных от Enum класса. Однако методы расширения можно использовать для добавления функциональных возможностей к конкретному типу перечисления.

В следующем примере перечисление Grades содержит возможные буквенные оценки, которые учащийся может получить в классе. Метод расширения с именем Passing добавляется в тип Grades, чтобы каждый экземпляр этого типа "знал", проходной это балл или нет. ExtensionsКласс также содержит статическую переменную для чтения и записи, которая определяет минимальный уровень прохождения. Возвращаемое значение Passing метода расширения отражает текущее значение этой переменной.

using System;

// Define an enumeration to represent student grades.
public enum Grades { F = 0, D = 1, C = 2, B = 3, A = 4 };

// Define an extension method for the Grades enumeration.
public static class Extensions
{
  public static Grades minPassing = Grades.D;

  public static bool Passing(this Grades grade)
  {
      return grade >= minPassing;
  }
}

class Example
{
  static void Main()
  {
      Grades g1 = Grades.D;
      Grades g2 = Grades.F;
      Console.WriteLine("{0} {1} a passing grade.", g1, g1.Passing() ? "is" : "is not");
      Console.WriteLine("{0} {1} a passing grade.", g2, g2.Passing() ? "is" : "is not");

      Extensions.minPassing = Grades.C;
      Console.WriteLine("\nRaising the bar!\n");
      Console.WriteLine("{0} {1} a passing grade.", g1, g1.Passing() ? "is" : "is not");
      Console.WriteLine("{0} {1} a passing grade.", g2, g2.Passing() ? "is" : "is not");
  }
}
// The exmaple displays the following output:
//       D is a passing grade.
//       F is not a passing grade.
//
//       Raising the bar!
//
//       D is not a passing grade.
//       F is not a passing grade.
Imports System.Runtime.CompilerServices

' Define an enumeration to represent student grades.
Public Enum Grades As Integer
   F = 0
   D = 1
   C = 2
   B = 3
   A = 4
End Enum   

' Define an extension method for the Grades enumeration.
Public Module Extensions
  Public minPassing As Grades = Grades.D
 
  <Extension>
  Public Function Passing(grade As Grades) As Boolean
     Return grade >= minPassing
  End Function
End Module

Public Module Example
  Public Sub Main()
      Dim g1 As Grades = Grades.D
      Dim g2 As Grades = Grades.F
      Console.WriteLine("{0} {1} a passing grade.", 
                        g1, If(g1.Passing(), "is", "is not"))
      Console.WriteLine("{0} {1} a passing grade.", 
                        g2, If(g2.Passing(), "is", "is not"))
      Console.WriteLine()
      
      Extensions.minPassing = Grades.C
      Console.WriteLine("Raising the bar!")
      Console.WriteLine()
      Console.WriteLine("{0} {1} a passing grade.", 
                        g1, If(g1.Passing(), "is", "is not"))
      Console.WriteLine("{0} {1} a passing grade.", 
                        g2, If(g2.Passing(), "is", "is not"))
  End Sub
End Module
' The exmaple displays the following output:
'       D is a passing grade.
'       F is not a passing grade.
'       
'       Raising the bar!
'       
'       D is not a passing grade.
'       F is not a passing grade.

Конструкторы

Enum()

Инициализирует новый экземпляр класса Enum.

Методы

CompareTo(Object)

Сравнивает этот экземпляр с заданным объектом и возвращает значение, указывающее, как соотносятся значения этих объектов.

Equals(Object)

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

Format(Type, Object, String)

Преобразует указанное значение заданного перечислимого типа в эквивалентное строковое представление в соответствии с заданным форматом.

GetHashCode()

Возвращает хэш-код для значения данного экземпляра.

GetName(Type, Object)

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

GetName<TEnum>(TEnum)

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

GetNames(Type)

Возвращает массив имен констант в указанном перечислении.

GetNames<TEnum>()

Возвращает массив имен констант в указанном типе перечисления.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
GetTypeCode()

Возвращает код типа базового типа члена этого перечисления.

GetUnderlyingType(Type)

Возвращает базовый тип заданного перечисления.

GetValues(Type)

Возвращает массив значений констант в указанном перечислении.

GetValues<TEnum>()

Возвращает массив значений констант в указанном типе перечисления.

HasFlag(Enum)

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

IsDefined(Type, Object)

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

IsDefined<TEnum>(TEnum)

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

MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
Parse(Type, ReadOnlySpan<Char>)

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

Parse(Type, ReadOnlySpan<Char>, Boolean)

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

Parse(Type, String)

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

Parse(Type, String, Boolean)

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

Parse<TEnum>(ReadOnlySpan<Char>)

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

Parse<TEnum>(ReadOnlySpan<Char>, Boolean)

Преобразует представление числа символов имени или числового значения одной или нескольких перечислимых констант, заданных, TEnum в эквивалентный перечислимый объект. Параметр указывает, учитывается ли в операции регистр.

Parse<TEnum>(String)

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

Parse<TEnum>(String, Boolean)

Преобразует строковое представление имени или числового значения одной или нескольких перечислимых констант, указанных в параметре TEnum, в эквивалентный перечислимый объект. Параметр указывает, учитывается ли в операции регистр.

ToObject(Type, Byte)

Преобразует значение заданного 8-разрядного целого числа в член перечисления.

ToObject(Type, Int16)

Преобразует значение заданного 16-разрядного знакового целого числа в член перечисления.

ToObject(Type, Int32)

Преобразует значение заданного 32-разрядного знакового целого числа в член перечисления.

ToObject(Type, Int64)

Преобразует значение заданного 64-разрядного знакового целого числа в член перечисления.

ToObject(Type, Object)

Преобразует заданный объект с целочисленным значением в член перечисления.

ToObject(Type, SByte)

Преобразует значение заданного 8-разрядного знакового целого числа в член перечисления.

ToObject(Type, UInt16)

Преобразует значение заданного 16-разрядного целого числа без знака в член перечисления.

ToObject(Type, UInt32)

Преобразует значение заданного 32-разрядного целого числа без знака в член перечисления.

ToObject(Type, UInt64)

Преобразует значение заданного 64-разрядного целого числа без знака в член перечисления.

ToString()

Преобразует значение этого экземпляра в эквивалентное ему строковое представление.

ToString(IFormatProvider)
Является устаревшей.
Является устаревшей.

Перегруженная версия метода является устаревшей, вместо нее следует использовать метод ToString().

ToString(String)

Преобразует числовое значение этого экземпляра в эквивалентное ему строковое представление с использованием указанного формата.

ToString(String, IFormatProvider)
Является устаревшей.
Является устаревшей.

Эта перегрузка метода является устаревшей. Используйте ToString(String).

TryParse(Type, ReadOnlySpan<Char>, Boolean, Object)

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

TryParse(Type, ReadOnlySpan<Char>, Object)

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

TryParse(Type, String, Boolean, Object)

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

TryParse(Type, String, Object)

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

TryParse<TEnum>(ReadOnlySpan<Char>, Boolean, TEnum)

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

TryParse<TEnum>(ReadOnlySpan<Char>, TEnum)

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

TryParse<TEnum>(String, Boolean, TEnum)

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

TryParse<TEnum>(String, TEnum)

Преобразует строковое представление имени или числового значения одной или нескольких перечислимых констант в эквивалентный перечислимый объект. Возвращаемое значение указывает, успешно ли выполнено преобразование.

Явные реализации интерфейса

IConvertible.GetTypeCode()

Возвращает код типа этого экземпляра Enum.

IConvertible.ToBoolean(IFormatProvider)

Преобразует текущее значение в логическое значение на основе его базового типа.

IConvertible.ToByte(IFormatProvider)

Преобразует текущее значение в 8-битовое целое число без знака на основе базового типа.

IConvertible.ToChar(IFormatProvider)

Преобразует текущее значение в символ Юникода на основе его базового типа.

IConvertible.ToDateTime(IFormatProvider)

Преобразует текущее значение в значение типа DateTime на основе его базового типа.

IConvertible.ToDecimal(IFormatProvider)

Преобразует текущее значение в значение типа Decimal на основе его базового типа.

IConvertible.ToDouble(IFormatProvider)

Преобразует текущее значение объекта в число двойной точности с плавающей запятой на основе его базового типа.

IConvertible.ToInt16(IFormatProvider)

Преобразует текущее значение в 16-битовое целое число со знаком на основе его базового типа.

IConvertible.ToInt32(IFormatProvider)

Преобразует текущее значение в 32-битовое целое число со знаком на основе его базового типа.

IConvertible.ToInt64(IFormatProvider)

Преобразует текущее значение в 64-битовое целое число со знаком на основе его базового типа.

IConvertible.ToSByte(IFormatProvider)

Преобразует текущее значение в 8-битовое целое число со знаком на основе его базового типа.

IConvertible.ToSingle(IFormatProvider)

Преобразует текущее значение в число с плавающей запятой одиночной точности на основе его базового типа.

IConvertible.ToString(IFormatProvider)
Является устаревшей.

Эта перегрузка метода является устаревшей, используйте вместо нее ToString().

IConvertible.ToType(Type, IFormatProvider)

Преобразует текущее значение к заданному типу на основе его базового типа.

IConvertible.ToUInt16(IFormatProvider)

Преобразует текущее значение в 16-битовое целое число без знака на основе его базового типа.

IConvertible.ToUInt32(IFormatProvider)

Преобразует текущее значение в 32-битовое целое число без знака на основе его базового типа.

IConvertible.ToUInt64(IFormatProvider)

Преобразует текущее значение в 64-битовое целое число без знака на основе его базового типа.

IFormattable.ToString(String, IFormatProvider)
Является устаревшей.

Эта перегрузка метода является устаревшей. Используйте ToString(String).

Применяется к

Потокобезопасность

Данный тип потокобезопасен.

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