2012-02-03 25 views
13

Tôi vừa mới nhận thấy rằng chỉ có một sự khác biệt nhỏ trong việc công bố một tổ chức phi thành viên kỳ thị công đoàn:Enum vs phi thành viên kỳ thị đoàn

type Color = 
    | Red 
    | Green 
    | Blue 

và tuyên bố một enum:

type Color = 
    | Red = 0 
    | Green = 1 
    | Blue = 2 

gì khác biệt chính của họ về hiệu suất, cách sử dụng, v.v ... là gì? Bạn có gợi ý khi sử dụng cái gì không?

Trả lời

14

Enum là stucts và do đó được phân bổ trên stack, trong khi các công đoàn phân biệt đối xử là các kiểu tham chiếu vì vậy được phân bổ đống. Vì vậy, bạn sẽ mong đợi DU được ít hơn performant rằng enums, mặc dù trong thực tế có thể bạn sẽ không bao giờ nhận thấy sự khác biệt này.

Quan trọng hơn là một liên minh phân biệt chỉ có thể là một trong các loại được khai báo, khi mà enums thực sự chỉ là số nguyên, vì vậy bạn có thể truyền một số nguyên không phải là thành viên của enum vào kiểu enum. Điều này có nghĩa là khi mẫu khớp với trình biên dịch có thể xác nhận rằng khớp mẫu được hoàn thành khi bạn đã bao phủ tất cả các trường hợp cho DU, nhưng đối với một enum, bạn phải luôn đặt một giá trị mặc định trong tất cả các trường hợp còn lại. sẽ luôn cần mẫu phù hợp như:

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

trường hợp trường hợp cuối cùng không cần thiết với DU.

Một điểm cuối cùng, vì enums được hỗ trợ nguyên bản trong cả C# và VB.NET, như DU không, enums thường là lựa chọn tốt hơn khi tạo API công khai để sử dụng bởi các ngôn ngữ khác.

6

Ngoài những gì Robert đã nói, kết hợp mẫu trên các công đoàn được thực hiện theo một trong hai cách. Đối với các công đoàn chỉ có trường hợp vô giá trị, tức là, các trường hợp không có giá trị liên quan (trường hợp này tương ứng chặt chẽ với enums), thuộc tính được tạo bởi trình biên dịch được tạo ra Tag, là int. Trong trường hợp này, bạn có thể mong đợi hiệu suất giống như với enums. Đối với các công đoàn có trường hợp không null, một thử nghiệm kiểu được sử dụng, mà tôi cho là cũng khá nhanh. Như Robert đã nói, nếu có sự khác biệt về hiệu suất thì điều đó không đáng kể. Nhưng trong trường hợp trước nó phải giống hệt nhau.

Về sự "không hoàn thiện" vốn có của enums, khi khớp mẫu không thành công, điều bạn thực sự muốn biết là trường hợp hợp lệ không được bao gồm trong trận đấu. Bạn thường không quan tâm nếu một giá trị số nguyên không hợp lệ được đúc vào enum. Trong trường hợp đó bạn muốn trận đấu thất bại. Tôi hầu như luôn luôn thích công đoàn, nhưng khi tôi phải sử dụng enums (thường cho khả năng tương tác), bên trong trường hợp ký tự bắt buộc tôi chuyển giá trị chưa từng có đến a function that distinguishes between valid and invalid values và tăng lỗi thích hợp.

0

Kể từ F # 4.1, có struct discriminated unions.

Chúng có các lợi ích hiệu suất của phân bổ ngăn xếp, như enums.

Họ có sự kết hợp vượt trội của các công đoàn phân biệt đối xử.

Chúng là F # cụ thể vì vậy nếu bạn cần được hiểu bởi các ngôn ngữ khác .Net bạn vẫn nên sử dụng enums.

Các vấn đề liên quan