0

私はこのコードを持っています:

[Flags]
public enum MyUriType {
    ForParse,
    ForDownload,
    Unknown
}

その後:

MyUriType uriType = MyUriType.ForDownload;

しかし、なぜこれがtrueを返すのか疑問に思っていました:

if ((uriType & MyUriType.ForParse) == MyUriType.ForParse)

第二コード群に設定されていない場合。お知らせ下さい。

4

2 に答える 2

8

デフォルトでは、enum型の最初のフィールドには序数値が与えられます0

したがって、 ifにフラグuriTypeが含まれていない場合、実際には equalsと評価されます。MyUriType.ForParseuriType & MyUriType.ForParse0trueMyUriType.ForParse0

ビット演算に分解すると、評価する式は次のようになります。

({something} & 0) == 0

true... 「何か」が何であれ、常に評価されます。

通常、Flags列挙型を定義するときは、実際には各フィールドの値を指定する必要があります。

[Flags]
public enum MyUriTypes
{
    None = 0,
    ForParse = 1,
    ForDownload = 2,
    ForSomethingElse = 4,
    ForAnotherThing = 8
}

競合しないように、各値は 2 のべき乗でなければなりません (2 の倍数はバイナリの左シフトです)。

Flags列挙型を使用する人が列挙型であり、複数の値を保持できる/保持する必要があることを理解できるように、複数形で名前を付けるのも慣例です。

列挙型をこのように定義すると、テスト コードはビットが設定されていないfalse場合に評価されます。uriTypeForParse

于 2010-04-16T02:34:24.183 に答える
0

次のように 2 の累乗で定義する必要があります。

[Flags]
public enum MyUriType {
None = 0
ForParse = 1,
ForDownload = 2,
Unknown = 4
}

オプションの組み合わせが設定されると予想される場合は、フラグが適切であることに注意してください (たとえば、ForParse + Unknown または ForDownload + Unknown)。一度に 1 つのオプションのみが適用される場合は、通常の列挙型を使用できます。

于 2010-04-16T02:38:39.853 に答える