수색…
소개
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
, long
및 ulong
사용할 수 있습니다. 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