2012-02-03 3 views

답변

14

열거 형은 stuct이므로 스택에 할당되며, 구분 된 공용 구조체는 참조 유형이므로 할당 된 힙입니다. 따라서, 열거 형보다 DU가 약간 성능이 좋을 것으로 기대할 수 있습니다. 실제로는이 차이를 결코 눈치 채지 못할 것입니다.

더 중요한 것은 차별화 된 공용체는 선언 된 유형 중 하나 일 뿐이며, 열거 형은 실제로는 정수이므로 열거 형의 구성원이 아닌 정수를 열거 형으로 캐스트 할 수 있습니다. 즉, 컴파일러가 패턴 일치를 수행하면 DU에 대한 모든 사례를 다룰 때 패턴 일치가 완료되었다고 주장 할 수 있지만 열거 형에 대해서는 항상 나머지 사례를 모두 잡아야합니다. 즉 열거 형에 대해 다음과 같은 패턴 일치가 항상 필요합니다.

match enumColor with 
| Red -> 1 
| Green -> 2 
| Blue -> 3 
| _ -> failwith "not an enum member" 

여기서 마지막 사례는 하위 사용자와 필요하지 않습니다.

마지막으로 C# 및 VB.NET에서 기본적으로 열거 형을 지원하므로 DU가 없으므로 열거 형은 다른 언어로 공용 API를 만들 때 더 적합한 선택입니다.

6

로버트 (Robert)가 말한 것 외에도, 유니언의 패턴 일치는 두 가지 방법 중 하나로 수행됩니다. null 값이없는 경우, 즉 연결된 값이없는 경우 (열거 형과 밀접하게 일치하는 경우) 컴파일러에서 생성 한 Tag 속성이 확인됩니다 (int). 이 경우 열거 형과 동일한 성능을 기대할 수 있습니다. null이 아닌 케이스가있는 공용체의 경우 유형 테스트가 사용됩니다.이 테스트는 꽤 빠르다고 가정합니다. 로버트 (Robert)가 말했듯이 성능 차이가 있다면 무시할 수 있습니다. 그러나 전자의 경우에는 정확히 동일해야합니다.

열거 형 고유의 "불완전 함"과 관련하여 패턴 일치가 실패 할 경우 실제로 알기 원하는 것은 유효한 대/소문자가 일치하지 않는 경우입니다. 유효하지 않은 정수 값이 열거 형으로 형변환 된 경우 일반적으로 신경 쓰지 않습니다. 이 경우 경기가 실패하기를 원합니다. 나는 거의 항상 노조를 선호하지만 enum을 사용해야 할 때 (보통 상호 운용성을 위해), 필연적 인 값을 a function that distinguishes between valid and invalid values으로 전달하고 적절한 오류를 발생시킵니다.

0

F # 4.1부터는 struct discriminated unions이 있습니다.

이러한 클래스에는 열거 형과 같은 스택 할당의 성능 이점이 있습니다.

그들은 식별 된 노동 조합과 우월한 일치를가집니다.

그들은 F #이므로 다른 .Net 언어에서 이해해야 할 필요가있는 경우 열거 형을 사용해야합니다.