2009-12-22 8 views
7

스타일 및 성능 고려 사항 모두에 관심이 있습니다. 개인적으로 .NET C# switch 문 비교 비교 enum 비교

public enum GreekLetters 
{ 
    UNKNOWN= 0, 
    ALPHA= 1, 
    BETA = 2, 
    etc... 

} 

string value = "Alpha"; 
GreekLetters letter = (GreekLetters)Enum.Parse(typeof(GreekLetters), value.ToUpper()); 

switch(letter) 
{ 
    case GreekLetters.ALPHA: 
     // do something 
     break; 
    case GreekLetters.BETA: 
     // do something else 
     break; 
    default: 
     break; 
} 
:

하나 :

string value = "ALPHA"; 

switch (value.ToUpper()) 
{ 
    case "ALPHA": 
    // do somthing 
    break; 
    case "BETA": 
    // do something else 
    break; 
    default: 
    break; 
} 

두 나의 선택은 다음 중 하나를 수행하는 (이 사이트에 대한 가난한 서식을하지만 인터페이스에 대해 유감을 WYSIWYG되지 않음)입니다 나는 아래의 두 가지 옵션을 선호하지만, 기본적인 스타일의 이유 이외의 다른 진짜 이유는 없습니다. 그러나, 나는 정말로 스타일의 이유가 있는지조차 확신하지 못합니다. 귀하의 의견을 보내 주셔서 감사합니다.

+0

훌륭한 인터뷰 질문을 할 수 있습니다. 프로파일 링을 통해서만 알 수 있습니다. 물론 Enum.Parse()의 성능에 달려 있기 때문에 - 물론, 옵션 성능이 비슷할지라도 2는 오타의 관점에서 유지하기가 더 쉽습니다. –

+0

+1의 열거 형 값을 "알 수 없음"으로 표시하는 데 +1. –

답변

4

look at the codeEnum.Parse 인 경우 옵션 1이 빠르기 때문에 일치하는 항목을 하나씩 찾아서 표시됩니다. 또한 일관성을 유지하고 유지하기위한 코드가 적습니다.

주의 사항 중 하나는 ToUpper을 사용하지 말고 Turkey Test 문제로 인해 ToUpperInvariant()을 사용해야한다는 것입니다.

옵션 # 2를 고집한다면 적어도 과부하를 사용하면 대소 문자를 무시하도록 지정할 수 있습니다. 이것은 직접 대문자로 변환하는 것보다 빠릅니다. 또한 Framework Design Guidelines은 모든 열거 형 값이 SCREAMING_CAPS 대신 PascalCase가되도록 권장합니다.

+2

심각하게 SCREAMING_CAPS이 (가) sooooo C++입니다. –

9

첫 번째 옵션은 전체 문자열 비교가 필요할 수 있으므로 두 번째 옵션은 약간 빠릅니다. 그러나 차이는 대부분의 상황에서 측정하기에는 너무 작습니다.

두 번째 옵션의 가장 큰 장점은 value의 유효한 값이 좁은 범위에 속한다는 점입니다. 실제로 문자열 값이 예상되는 범위에 없으면 정확히 원하는 것일 경우 Enum.Parse에 예외가 발생합니다.

+0

두 번째 옵션은 모든 필드를 수집 한 다음 항목 별 비교를 수행하기 위해 반사 적 히트가 필요하므로 속도가 느립니다. 필자는 이것을 입증하기 위해 프레임 워크 소스 코드를 가리킨다. –

1

나는 확실히 # 1이라고 말할 것입니다. Enum.Parse()는 상대적으로 비용이 많이 드는 반사를 유발합니다. 더하기, Enum.Parse()는 정의되지 않았고 TryParse()가 없으므로 예외를 throw합니다.

2

질문의 성능 부분에 대해서는 언급 할 수 없습니다. 스타일에 관해서는 옵션 # 2를 선호합니다. 알려진 값 집합이 있고 집합이 합리적으로 작을 때마다 (열두 개 정도) 열거 형을 사용하는 것을 선호합니다. 열거 형은 문자열 값 모음보다 작업하기가 훨씬 쉽고 코드를 보는 사람은 허용되는 값 집합이 무엇인지 빠르게 볼 수 있습니다.

0

문자열 값과 열거 형을 전환 할 때 성능 차이가 있는지 확실하지 않습니다.

고려해야 할 사항 중 하나는 코드의 다른 부분에있는 case 문에 사용되는 값이 필요합니다. 그렇다면 열거 형을 사용하면 값의 단일 정의가있을 때 더 이해할 수 있습니다. Const 문자열도 사용할 수 있습니다.

2

실제로 열거 형의 항목 수에 따라 다르므로 각 시나리오별로 테스트해야합니다. 큰 차이를 만들 수는 없습니다. 그러나 그것은 큰 질문입니다.

값이 매우 적은 Enum.Parse는 두 예제 중 어떤 것보다 많은 시간이 걸리므로 두 번째는 느려야합니다.

값이 충분하면 switch 문이 문자열과 열거와 동일한 속도로 작동하는 해시 테이블로 구현되므로 Enum.Parse는 두 번째 해를 느리게 만들지 만 상대적으로 많이 만들지는 않습니다.

중간에 문자열을 비교하는 것보다 열거 형을 비교하는 것이 비용이 더 많이 들것입니다. 첫 번째 솔루션이 더 빠를 것입니다.

다른 컴파일러 버전이나 다른 옵션이 다르면 놀랄 일도 아닙니다.