Enum은 확실히 코드를 더 읽기 쉽게 만들 수 있습니다. (적어도 .net에서는)주의해야 할 몇 가지 사항이 있습니다.
enum의 기본 저장소는 int이므로 기본값은 0이되므로 0이 적절한 기본값인지 확인해야합니다. (예를 들어 구조체는 생성 될 때 모든 필드가 0으로 설정되어 있으므로 0 이외의 기본값을 지정할 방법이 없습니다. 0 값이 없으면 int로 캐스팅하지 않고 열거 형을 테스트 할 수도 없습니다. 나쁜 스타일.)
열거 형이 코드에 비공개 인 경우 (공개적으로 노출되지 않음) 여기서 읽기를 중지 할 수 있습니다.
열거 형이 어떤 방식 으로든 외부 코드에 게시 되거나 프로그램 외부에 저장되는 경우 명시 적으로 번호를 매기는 것이 좋습니다. 컴파일러는 자동으로 0부터 번호를 지정하지만 값을 제공하지 않고 열거 형을 재 배열하면 결국 결함이 발생할 수 있습니다.
나는 합법적으로 쓸 수있다
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
이를 방지하기 위해, 확신 할 수없는 열거 형 (예 : 공개 API)을 사용하는 코드는 열거 형이 유효한지 확인해야합니다. 이것을 통해
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
유일한 경고 Enum.IsDefined
는 반사를 사용하고 느리다는 것입니다. 또한 버전 관리 문제도 있습니다. 열거 형 값을 자주 확인해야하는 경우 다음을 수행하는 것이 좋습니다.
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
버전 관리 문제는 이전 코드가 보유한 2 개의 열거 형을 처리하는 방법 만 알 수 있다는 것입니다. 세 번째 값을 추가하면 Enum.IsDefined가 true가되지만 이전 코드가이를 처리 할 수는 없습니다. 으악.
[Flags]
열거 형으로 할 수있는 재미가 훨씬 더 많으며 이에 대한 유효성 검사 코드는 약간 다릅니다.
또한 이식성 ToString()
을 위해 열거 형에 대한 호출 을 사용 Enum.Parse()
하고 다시 읽을 때 사용해야 합니다. 둘 다 ToString()
및 열거 형도 Enum.Parse()
처리 할 수 [Flags]
있으므로 사용하지 않을 이유가 없습니다. 이제 코드를 깨지 않고는 열거 형의 이름을 변경할 수도 없기 때문에 또 다른 함정입니다.
그래서 가끔은 부울 하나만으로도 빠져 나갈 수 있을까요?