다음 Enum을 정의했다고 상상해보십시오.
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
열거 형을 사용하는 가장 좋은 방법은 무엇입니까? 1
위의 예제 와 같이 시작 하거나 다음 과 같이 0
명시 적 값없이 시작 해야합니다 .
public enum Status : byte
{
Inactive,
Active
}
다음 Enum을 정의했다고 상상해보십시오.
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
열거 형을 사용하는 가장 좋은 방법은 무엇입니까? 1
위의 예제 와 같이 시작 하거나 다음 과 같이 0
명시 적 값없이 시작 해야합니다 .
public enum Status : byte
{
Inactive,
Active
}
답변:
✔️ DO는 간단한 열거 형에 0 값을 제공합니다.
"없음"과 같은 값을 호출하십시오. 이러한 값이이 특정 열거 형에 적합하지 않은 경우 열거 형의 가장 일반적인 기본값에는 기본 값인 0이 할당되어야합니다.
프레임 워크 디자인 가이드 라인 / 플래그 열거 디자인 :
❌ 값이 "모든 플래그가 지워짐"을 나타내지 않고 다음 지침에 규정 된대로 적절하게 명명되지 않은 경우 플래그 열거 형 값 0을 사용하지 마십시오.
✔️ DO 열거의 0 값 이름을 None으로 지정하십시오. 플래그 열거의 경우, 값은 항상 "모든 플래그가 지워짐"을 의미해야합니다.
switch
문 default
에서을 던지는 섹션으로 이동합니다 InvalidEnumArgumentException
. 그렇지 않으면 프로그램이 의도하지 않게 열거의 0 값으로 계속 실행될 수 있으며, 이는 유효하고 눈에 띄지 않을 수 있습니다.
글쎄, 나는 대답을 명시 적으로 번호를 매기 지 않는다고 말하는 대부분의 답변에 동의하지 않는 것 같습니다. 나는 항상 명시 적으로 번호를 매기지만, 대부분의 경우 정수 값으로 저장된 데이터 스트림에 유지하기 때문입니다. 명시 적으로 값을 추가하지 않고 새 값을 추가하면 직렬화가 중단되고 오래 지속되는 개체를 정확하게로드 할 수 없습니다. 이러한 값의 영구 저장소 유형을 수행하려는 경우 값을 명시 적으로 설정하는 것이 좋습니다.
Enum은 값 유형이며 명시 적으로 초기화되지 않은 경우 기본값 (예 : 클래스의 Enum 필드)은 0입니다.
따라서 일반적으로 정의 된 상수 (예 : 알 수 없음)로 0을 원합니다.
예를 들어, Inactive
기본값이 되려면 값이 0이어야합니다. 그렇지 않으면 상수 추가를 고려할 수 있습니다 Unknown
.
일부 사람들은 상수 값을 명시 적으로 지정하지 않는 것이 좋습니다. 대부분의 경우 좋은 조언이지만, 그렇게하고 싶을 때가 있습니다.
플래그 열거 형
외부 시스템과의 상호 운용에 사용되는 값을 가진 열거 형 (예 : COM)
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
,보다 읽기 쉬운 방법 [Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
입니다.)
[Flags] enum MyFlags { None=0, A, B, C }
초래 [Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
플래그 열거 형에 대한 당신이 일반적으로 C = 4 원하는 것 반면.
가장 좋은 방법은 번호를 지정하지 않고 암시 적으로 만드는 것입니다. 0에서 시작합니다. 암시 적이므로 항상 따라야하는 언어 기본 설정 :)
사용 방법에 따라 다릅니다. 열거를 플래그 지정하려면 다음 None
과 같이 값에 0을 지정하는 것이 좋습니다 .
[Flags]
enum MyEnum
{
None = 0,
Option1 = 1,
Option2 = 2,
Option3 = 4,
All = Option1 | Option2 | Option3,
}
열거 형이 데이터베이스 조회 테이블에 매핑 될 가능성이 높으면 1로 시작합니다. 전문적으로 작성된 코드에는별로 중요하지 않지만 가독성이 향상됩니다.
다른 경우에는 0 또는 1로 시작하는지 여부를 신경 쓰지 않고 그대로 둡니다.
당신은 원시 값을 사용하는 좋은 이유가없는 한, 당신은 오직 암시 적 값을 사용하고 그들을 참조해야 Status.Active
하고 Status.Inactive
.
중요한 것은 플랫 파일이나 DB에 데이터를 저장하거나 다른 사람이 만든 플랫 파일이나 DB를 사용하고 싶을 수 있습니다. 직접 만드는 경우 번호 매기기가 Enum의 용도와 일치하도록 만드십시오.
데이터가 자신의 것이 아닌 경우 물론 원래 개발자가 번호 매기기 체계로 사용한 것을 사용하려고합니다.
Enum을 플래그 집합으로 사용하려는 경우 다음과 같은 간단한 규칙이 있습니다.
enum Example
{
None = 0, // 0
Alpha = 1 << 0, // 1
Beta = 1 << 1, // 2
Gamma = 1 << 2, // 4
Delta = 1 << 3, // 8
Epsilon = 1 << 4, // 16
All = ~0, // -1
AlphaBeta = Alpha | Beta, // 3
}
값은 2의 거듭 제곱이어야하며 비트 시프트 연산을 사용하여 표현할 수 있습니다. None
분명히되어야 0
하지만 All
덜 분명하다 -1
. ~0
이진의 부정 인 0
에 모든 비트 세트를 갖는 다수의 결과 1
, 의 값을 나타낸다-1
. 복합 플래그 (종종 편의상 사용됨)의 경우 비트 단위 또는 연산자를 사용하여 다른 값을 병합 할 수 있습니다 |
.
지정하지 않으면 번호 매기기는 0에서 시작합니다.
열거 형은 종종 문자열이 아닌 int로 직렬화되고 저장되므로 명시 적이어야합니다.
데이터베이스에 저장된 열거 형의 경우 유지 관리 중 이동 및 재 할당을 방지하기 위해 항상 옵션에 번호를 매 깁니다.
Microsoft에 따르면 권장되는 규칙은 첫 번째 0 옵션을 사용하여 초기화되지 않은 또는 가장 일반적인 기본값을 나타냅니다.
다음은 0 대신 1에서 번호를 시작하는 바로 가기입니다.
public enum Status : byte
{
Inactive = 1,
Active
}
열거 형 값에 비트 연산자를 사용하기 위해 플래그 값을 설정하려면 0 값에서 번호 매기기를 시작하지 마십시오.
1에서 시작하면 쉽게 많은 것을 얻을 수 있습니다.
{
BOX_THING1 = 1,
BOX_THING2 = 2,
BOX_NUM_THING = BOX_THING2
};
0에서 시작하면 초기화되지 않은 것들에 대한 값으로 첫 번째 것을 사용하십시오.
{
BOX_NO_THING = 0,
BOX_THING1 = 1,
BOX_THING2 = 2,
BOX_NUM_THING = BOX_THING2
};
배열 또는 목록에 대한 인덱스로 인덱스를 사용하는 것과 같은 이유가 있거나 비트 연산에서 사용하는 것과 같은 다른 실제적인 이유가없는 경우 0에서 시작하지 마십시오.
당신은 enum
그것을 할 필요가 정확히 어디서부터 시작해야한다. 또한 순차적 일 필요는 없습니다. 값이 명시 적으로 설정되면 의미 적 의미 나 실제 고려 사항을 반영해야합니다. 예를 들어, enum
"벽의 병"은 1에서 99까지 번호를 매기는 반면 enum
4의 거듭 제곱은 4에서 시작하여 16, 64, 256 등으로 계속해야합니다.
또한 값이 0 인 요소를에 추가하는 enum
것은 유효한 상태를 나타내는 경우에만 수행해야합니다. 때때로 "없음", "알 수 없음", "누락"등은 유효한 값이지만 여러 번 유효하지 않습니다.
열거 형을 0에서 시작하는 것이 좋습니다. 기본값이므로 알 수없는 값을 -1 값으로 포함하고 싶습니다. 그러면 이것이 기본값이되고 때로는 디버깅에 도움이 될 수 있습니다.