2012-05-13 23 views
10

tôi nhận thấy hai mô hình này để kiểm tra cho một lá cờ enum:Thực hành tốt nhất để kiểm tra cho một lá cờ enum

[Flags] 
public enum PurchaseType 
{ 
    None = 0, 
    SalePrice = 2, 
    RegularPrice = 4, 
    Clearance = 8, 
    CreditCard = 16 
} 

public void Test() 
{ 
    PurchaseType type = PurchaseType.Clearance; 
    type |= PurchaseType.CreditCard; 

    // Practice 1 
    if ((type & PurchaseType.Clearance) == PurchaseType.Clearance) 
    { 
     // Clearance item handling 
    } 

    // Practice 2 
    if ((type & PurchaseType.CreditCard) != 0) 
    { 
     // Credit card item handling 
    } 
} 

Trong hai cách để kiểm tra cho một lá cờ enum, cái nào là tốt hơn hiệu suất wrt, dễ đọc, mã sức khỏe, và bất kỳ cân nhắc khác tôi nên thực hiện?

Cảm ơn, Mohammed

+1

Tốt hơn cho những gì? Dễ đọc? Hiệu suất? Giai đoạn của mặt trăng? Thứ gì khác? – Oded

+2

Tôi bỏ phiếu cho thực hành 1. Làm thế nào bạn sẽ thử nghiệm cho 'PurchaseType.None' với thực hành 2? Chỉnh sửa: Tôi đoán bạn có thể làm (loại & PurchaseType.None) == 0, nhưng sau đó bây giờ kiểm tra của bạn không thực sự phù hợp. – Tung

+0

@Tung Er, 'None' không phải là cờ có thể được kiểm tra. 'type & PurchaseType.None' là' 0' cho tất cả các giá trị của 'type'. Bạn không bao giờ có thể kiểm tra cho 'Không có' vì vậy không có điểm đáng lo ngại về việc làm thế nào để làm những gì không thể được thực hiện và không bao giờ được thực hiện. –

Trả lời

15

Net 4 giới thiệu một phương pháp HasFlag xác định liệu một hoặc nhiều lĩnh vực bit được thiết lập trong trường hợp hiện tại, đây là bởi đến nay các thực hành tốt nhất:

type.HasFlag(PurchaseType.CreditCard); // true 
+0

Có vẻ dễ sử dụng hơn. Tôi đã thấy [vấn đề kết nối] này (http://connect.microsoft.com/VisualStudio/feedback/details/554908/enum-hasflag-tremendously-bad-performance) liên quan đến hiệu suất. Tôi tự hỏi nếu điều này đã được cố định trong 4.0. –

+2

A [blog entry] (http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/01/28/enum-hasflag-good-or-bad.aspx) liên quan đến hiệu suất này và hiệu suất kém. Có vẻ như đây không chỉ là một số cú pháp đơn giản. Phương pháp này dường như sử dụng sự phản chiếu theo bài viết này. –

+0

Tôi thấy nhiều upvotes cho câu trả lời này và bây giờ là tò mò. Hãy nói rằng có một hình phạt hoàn hảo cho việc sử dụng này hơn những người khác. Liệu khả năng đọc có thể giành chiến thắng ở đây trên hiệu suất không? –

2

tôi sẽ chọn cái đầu tiên:

if ((type & PurchaseType.Clearance) == PurchaseType.Clearance) 
{ 
    // Clearance item item handling 
} 

nguyên nhân rõ ràng Ngao rằng bạn đang kiểm tra cho Clearance loại hiện diện.

+3

Hmm, tôi không thích lắm. Tôi có thể thấy sự trùng lặp. Nếu bạn thay đổi 'Clearance' thành một trong những lá cờ khác nhưng quên làm điều đó ở cả hai vị trí, sau đó mã của bạn sẽ biên dịch, nhưng nó sẽ không làm những gì bạn muốn. '! = 0' thắng cho tôi. –

+0

@DavidHeffernan: đồng ý (trên dupplicate), nhưng giống như tuyên bố ngầm rõ ràng. – Tigran

+0

@ David: Tôi thực sự đã mắc lỗi chính xác này khi nhập câu hỏi của mình! –

1

Cá nhân tôi sẽ luôn luôn thích có thể đọc rõ ràng về HasFlag.

Tuy nhiên, trong hai tùy chọn trong câu hỏi tôi nghĩ !=0 là an toàn hơn vì không có sự trùng lặp. Nếu bạn sử dụng thay thế của bạn thì tất cả quá dễ dàng khi mã hóa bảo trì để thay đổi một trong những lá cờ và quên thay đổi một lá cờ khác. Và sau đó bạn kết thúc với điều này

if ((type & PurchaseType.Clearance) == PurchaseType.CreditCard) 
+0

trong ngữ cảnh hiệu suất. có một dàn diễn viên tham gia vào việc sử dụng kiểm tra! = 0 không? –

+0

Làm cách nào để so sánh với 0 có ý nghĩa về hiệu suất? –

+0

Giá trị 0 có phải được đúc trong khi kiểm tra không? Nếu vậy, nó có tồi tệ hơn lựa chọn nào khác trong câu hỏi của tôi không? –

1

Tôi muốn (type & PurchaseType.CreditCard) != 0 bởi vì nếu bạn muốn kiểm tra nhiều hơn một chút sau đó phía bên tay phải trở nên cồng kềnh. Tôi tin tưởng vào các hoạt động bit mà ở trên sẽ chỉ đúng nếu và chỉ khi bit (s) được thiết lập.

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