수색…


소개

enum은 byte, sbyte, short, ushort, int, uint, long, ulong 유형 중 하나에서 파생 될 수 있습니다. 기본값은 int이며 열거 형 정의에서 유형을 지정하여 변경할 수 있습니다.

Weekday : byte {Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5}

이것은 원시 코드로의 P / 호출, 데이터 소스에 대한 매핑 및 이와 유사한 상황에서 유용합니다. 대부분의 개발자가 enum을 int로 기대하기 때문에 일반적으로 기본 int를 사용해야합니다.

통사론

  • enum 색상 {Red, Green, Blue} // Enum 선언
  • enum 색상 : byte {빨강, 녹색, 파랑} // 특정 유형의 선언
  • enum Colors {Red = 23, Green = 45, Blue = 12} // 정의 된 값을 가진 선언
  • Colors.Red // 열거 형의 요소에 액세스합니다.
  • int value = (int) Colors.Red // enum 요소의 int 값을 가져옵니다.
  • Colors color = (Colors) intValue // int에서 enum 요소를 가져옵니다.

비고

Enum ( "열거 형"의 줄임말)은 형식 별 식별자로 표현되는 명명 된 상수 집합으로 구성된 형식입니다.

열거 형은 (일반적으로 작은) 가능한 불연속 값을 갖는 개념을 표현하는 데 가장 유용합니다. 예를 들어, 요일 또는 한 달을 나타내는 데 사용할 수 있습니다. 또한 비트 연산을 사용하여 결합하거나 검사 할 수있는 플래그로 사용할 수 있습니다.

열거 형의 모든 멤버 값 가져 오기

enum MyEnum
{
    One,
    Two,
    Three
}

foreach(MyEnum e in Enum.GetValues(typeof(MyEnum)))
    Console.WriteLine(e);

그러면 다음과 같이 인쇄됩니다.

One
Two
Three

플래그로서의 열거

FlagsAttribute 는 열거 형의 특성에 맞게 ToString() 의 비헤이비어를 변경하는 열거 형에 적용될 수 있습니다.

[Flags]
enum MyEnum
{
    //None = 0, can be used but not combined in bitwise operations
    FlagA = 1,
    FlagB = 2,
    FlagC = 4,
    FlagD = 8  
    //you must use powers of two or combinations of powers of two 
    //for bitwise operations to work
}

var twoFlags = MyEnum.FlagA | MyEnum.FlagB;

// This will enumerate all the flags in the variable: "FlagA, FlagB".
Console.WriteLine(twoFlags);

FlagsAttribute 는 열거 상수가 2의 제곱 (또는 그 조합)이되고 결과 집합이 궁극적으로 숫자 값이므로 의존하는 숫자 형식의 크기에 따라 제한됩니다. 사용할 수있는 가장 큰 숫자 형식은 UInt64 이며 64 개의 별개의 (결합되지 않은) 플래그 열거 형 상수를 지정할 수 있습니다. enum 키워드의 기본 형식은 Int32 int 입니다. 컴파일러는 32 비트보다 넓은 값의 선언을 허용합니다. 그것들은 경고없이 랩되고 동일한 값을 가진 두 개 이상의 열거 형 멤버가됩니다. 따라서 열거 형이 32 개 이상의 플래그 비트 세트를 수용하기위한 것이라면 명시 적으로 더 큰 유형을 지정해야합니다.

public enum BigEnum : ulong
{
    BigValue = 1 << 63
}

플래그는 종종 단일 비트이지만 종종 더 쉽게 사용할 수 있도록 명명 된 "세트"로 결합 될 수 있습니다.

[Flags]
enum FlagsEnum
{
    None = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
       
    Default = Option1 | Option3,
    All = Option1 | Option2 | Option3,
}

2의 거듭 제곱의 10 진수 값을 철자 표시하지 않으려면 왼쪽 시프트 연산자 (<<) 를 사용하여 동일한 열거 형을 선언 할 수도 있습니다

[Flags]
enum FlagsEnum
{
    None = 0,
    Option1 = 1 << 0,
    Option2 = 1 << 1,
    Option3 = 1 << 2,
       
    Default = Option1 | Option3,
    All = Option1 | Option2 | Option3,
}

C # 7.0부터는 바이너리 리터럴도 사용할 수 있습니다.

enum 변수의 값에 특정 플래그가 설정되어 있는지 확인하려면 HasFlag 메서드를 사용할 수 있습니다. 우리가 가지고 있다고 가정 해 봅시다.

[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Three = 4
}

그리고 value

var value = MyEnum.One | MyEnum.Two;

HasFlag 를 사용하면 플래그가 설정되었는지 확인할 수 있습니다.

if(value.HasFlag(MyEnum.One))
    Console.WriteLine("Enum has One");

if(value.HasFlag(MyEnum.Two))
    Console.WriteLine("Enum has Two");

if(value.HasFlag(MyEnum.Three))
    Console.WriteLine("Enum has Three");

또한 enum의 모든 값을 반복하여 설정할 수있는 모든 플래그를 얻을 수 있습니다.

var type = typeof(MyEnum);
var names = Enum.GetNames(type);

foreach (var name in names)
{
    var item = (MyEnum)Enum.Parse(type, name);

    if (value.HasFlag(item))
        Console.WriteLine("Enum has " + name);
}

또는

foreach(MyEnum flagToCheck in Enum.GetValues(typeof(MyEnum)))
{
    if(value.HasFlag(flagToCheck))
    {
         Console.WriteLine("Enum has " + flagToCheck);
    }
}

세 가지 예제가 모두 인쇄됩니다.

Enum has One
Enum has Two

비트 논리로 플래그 스타일의 enum 값을 테스트하십시오.

flags 스타일의 enum 값은 단일 값과 일치하지 않을 수 있으므로 비트 논리로 테스트해야합니다.

[Flags]
enum FlagsEnum
{
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option2And3 = Option2 | Option3;

    Default = Option1 | Option3,
}

Default 은 실제로 비트 OR과 병합 된 다른 두 개의 조합입니다. 따라서 플래그가 있는지 테스트하려면 비트 AND를 사용해야합니다.

var value = FlagsEnum.Default;

bool isOption2And3Set = (value & FlagsEnum.Option2And3) == FlagsEnum.Option2And3;

Assert.True(isOption2And3Set);

열거하고 다시 열거하십시오

public enum DayOfWeek
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

    
// Enum to string
string thursday = DayOfWeek.Thursday.ToString(); // "Thursday"

string seventhDay = Enum.GetName(typeof(DayOfWeek), 6); // "Saturday"

string monday = Enum.GetName(typeof(DayOfWeek), DayOfWeek.Monday); // "Monday"


// String to enum (.NET 4.0+ only - see below for alternative syntax for earlier .NET versions)
DayOfWeek tuesday;
Enum.TryParse("Tuesday", out tuesday); // DayOfWeek.Tuesday

DayOfWeek sunday;
bool matchFound1 = Enum.TryParse("SUNDAY", out sunday); // Returns false (case-sensitive match)

DayOfWeek wednesday;
bool matchFound2 = Enum.TryParse("WEDNESDAY", true, out wednesday); // Returns true; DayOfWeek.Wednesday (case-insensitive match)


// String to enum (all .NET versions)
DayOfWeek friday = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Friday"); // DayOfWeek.Friday

DayOfWeek caturday = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Caturady"); // Thows ArgumentException

// All names of an enum type as strings
string[] weekdays = Enum.GetNames(typeof(DayOfWeek));

열거 형의 기본값 == ZERO

열거 형의 기본값은 0 입니다. 열거 형에서 값이 0 인 항목을 정의하지 않으면 기본값은 0입니다.

public class Program
{        
    enum EnumExample
    {
        one = 1,
        two = 2
    }
    
    public void Main()
    {              
        var e = default(EnumExample);
        
        if (e == EnumExample.one)
            Console.WriteLine("defaults to one");
        else
            Console.WriteLine("Unknown");    
    }    
}

예 : https://dotnetfiddle.net/l5Rwie

열거 기본 사항

MSDN에서 :

열거 형 (열거 형 또는 열거 형이라고도 함)은 변수에 할당 될 수있는 명명 된 정수 상수 를 정의하는 효율적인 방법을 제공 합니다 .

본질적으로 열거 형은 유한 옵션 세트 만 허용하는 유형이며 각 옵션은 숫자에 해당합니다. 기본적으로 숫자는 0부터 시작하여 값이 선언 된 순서대로 증가합니다. 예를 들어, 요일에 대한 열거 형을 선언 할 수 있습니다.

public enum Day
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

그 열거 형은 다음과 같이 사용할 수 있습니다 :

// Define variables with values corresponding to specific days
Day myFavoriteDay = Day.Friday;
Day myLeastFavoriteDay = Day.Monday;

// Get the int that corresponds to myFavoriteDay
// Friday is number 4
int myFavoriteDayIndex = (int)myFavoriteDay;

// Get the day that represents number 5
Day dayFive = (Day)5;

기본적으로 enum 형의 각 요소의 기본 유형은 int 이지만 byte , sbyte , short , ushort , uint , longulong 사용할 수 있습니다. int 아닌 다른 유형을 사용하는 경우 열거 형 이름 뒤에 콜론을 사용하여 유형을 지정해야합니다.

public enum Day : byte 
{
    // same as before 
}

이름 뒤의 숫자는 이제 정수가 아닌 바이트입니다. 다음과 같이 기본 형식의 열거 형을 가져올 수 있습니다.

Enum.GetUnderlyingType(typeof(Days)));

산출:

System.Byte

데모 : .NET 바이올린

enum을 사용한 비트 단위 조작

FlagsAttribute 는 열거 형이 단일 값이 아닌 플래그 집합을 나타낼 때마다 사용해야합니다. 각 enum 값에 할당 된 숫자 값은 비트 연산자를 사용하여 enum을 조작 할 때 도움이됩니다.

예제 1 : [Flags]

[Flags]
enum Colors
{
    Red=1,
    Blue=2,
    Green=4,
    Yellow=8
}

var color = Colors.Red | Colors.Blue;
Console.WriteLine(color.ToString());

빨간색, 파란색을 인쇄합니다.

예제 2 : [Flags]가없는 경우

enum Colors
{
    Red=1,
    Blue=2,
    Green=4,
    Yellow=8
}
var color = Colors.Red | Colors.Blue;
Console.WriteLine(color.ToString());

3 장 인쇄

플래그에 << 표기법 사용

왼쪽 시프트 연산자 ( << )는 플래그 enum 선언에 사용되어 각 플래그가 플래그와 같이 반드시 2 진 표현으로 1 을 갖도록합니다.

또한 큰 enum에 많은 플래그가있는 가독성을 향상시키는 데 도움이됩니다.

[Flags]
public enum MyEnum 
{
    None  = 0,
    Flag1 = 1 << 0,
    Flag2 = 1 << 1,
    Flag3 = 1 << 2,
    Flag4 = 1 << 3,
    Flag5 = 1 << 4,
    ...
    Flag31 = 1 << 30
}

MyEnum 에 적절한 플래그가 포함되어 있고 Flag30 = 1073741822 (또는 111111111111111111111111111110 바이너리)와 같이 지저분한 것들이 MyEnum 것은 분명합니다.

enum 값에 추가 설명 정보 추가

경우에 따라 enum 값 자체에 사용자에게 표시 할 수있는 것보다 읽기 쉽지 않은 경우와 같이 enum 값에 추가 설명을 추가 할 수 있습니다. 이 경우 System.ComponentModel.DescriptionAttribute 클래스를 사용할 수 있습니다.

예 :

public enum PossibleResults
{
    [Description("Success")]
    OK = 1,
    [Description("File not found")]
    FileNotFound = 2,
    [Description("Access denied")]
    AccessDenied = 3
}

이제 특정 enum 값에 대한 설명을 반환하려는 경우 다음을 수행 할 수 있습니다.

public static string GetDescriptionAttribute(PossibleResults result)
{
        return ((DescriptionAttribute)Attribute.GetCustomAttribute((result.GetType().GetField(result.ToString())), typeof(DescriptionAttribute))).Description;
}

static void Main(string[] args)
{
    PossibleResults result = PossibleResults.FileNotFound;
    Console.WriteLine(result); // Prints "FileNotFound"
    Console.WriteLine(GetDescriptionAttribute(result)); // Prints "File not found"
}

이것은 또한 모든 enum에 대한 확장 메소드로 쉽게 변형 될 수 있습니다.

static class EnumExtensions
{
    public static string GetDescription(this Enum enumValue)
    {
        return ((DescriptionAttribute)Attribute.GetCustomAttribute((enumValue.GetType().GetField(enumValue.ToString())), typeof(DescriptionAttribute))).Description;
    }
}

그리고 다음과 같이 쉽게 사용할 수 있습니다 : Console.WriteLine(result.GetDescription());

신고 된 enum에서 값 추가 및 제거

이 코드는 플래그가 지정된 enum-instance에서 값을 추가 및 제거합니다.

[Flags]
public enum MyEnum
{
    Flag1 = 1 << 0,
    Flag2 = 1 << 1,
    Flag3 = 1 << 2
}

var value = MyEnum.Flag1;

// set additional value
value |= MyEnum.Flag2;  //value is now Flag1, Flag2
value |= MyEnum.Flag3;  //value is now Flag1, Flag2, Flag3

// remove flag
value &= ~MyEnum.Flag2; //value is now Flag1, Flag3    

Enum은 예기치 않은 값을 가질 수 있습니다.

열거 형은 기본 내부 형식과의 사이에 캐스팅 될 수 있으므로이 값은 열거 형 정의에 지정된 값 범위를 벗어날 수 있습니다.

아래 열거 형 DaysOfWeek 에는 7 개의 정의 된 값만 있지만 모든 int 값을 보유 할 수 있습니다.

public enum DaysOfWeek
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7
}

DaysOfWeek d = (DaysOfWeek)31;
Console.WriteLine(d); // prints 31

DaysOFWeek s = DaysOfWeek.Sunday;
s++; // No error

현재이 동작이없는 열거 형을 정의 할 수있는 방법이 없습니다.

그러나 정의되지 않은 enum 값은 Enum.IsDefined 메서드를 사용하여 감지 할 수 있습니다. 예를 들어,

DaysOfWeek d = (DaysOfWeek)31;
Console.WriteLine(Enum.IsDefined(typeof(DaysOfWeek),d)); // prints False


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow