10

enum フラグをチェックするための次の 2 つのパターンに気付きました。

[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   
    }
}

enum フラグをチェックする 2 つの方法のうち、パフォーマンス、読みやすさ、コードの健全性、およびその他の考慮事項に関して、どちらが優れていますか?

ありがとう、モハメッド

4

4 に答える 4

17

.Net 4 ではHasFlag、現在のインスタンスで 1 つ以上のビット フィールドが設定されているかどうかを判断するメソッドが導入されています。これは、断然ベスト プラクティスです。

type.HasFlag(PurchaseType.CreditCard);  // true
于 2012-05-13T19:04:00.740 に答える
2

私は最初のものを選びます:

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

Clearance型の存在をチェックしていることは明らかです。

于 2012-05-13T19:03:12.583 に答える
1

個人的には、 の明確な可読性を常に好みHasFlagます。

!=0ただし、質問の2つのオプションのうち、重複がないため、より安全だと思います。別の方法を使用すると、保守コーディングでフラグの 1 つを変更し、もう 1 つを変更するのを忘れてしまうのは非常に簡単です。そして、あなたはこれで終わります

if ((type & PurchaseType.Clearance) == PurchaseType.CreditCard)
于 2012-05-13T19:59:14.493 に答える
1

(type & PurchaseType.CreditCard) != 0複数のビットをチェックしたい場合は、右側が面倒になるので、私はそれを好みます。ビット操作では、ビットが設定されている場合にのみ上記が真になると信じています。

于 2012-05-13T20:45:15.107 に答える