申請[Flags]って実際どうなの?
の動作を変更することは知っていますがEnum.ToString、他に何かしますか? (例: 異なるコンパイラまたは実行時の動作など)
編集:ええ、列挙型がビットごとのフラグとして使用されることを意図しており、それをビットフラグに適用する方がより論理的であるという事実が文書化されていることは承知しています。ただし、一般的なプログラミングの実践ではなく、具体的な動作の変更についてもっと質問していました。
MSDNの記事から:
Flagsが指定されている場合、ParseメソッドとFormatメソッドは高度な機能を備えていることに注意してください。
同様に、Parseメソッドは、今示したようなコンマ区切りの文字列を適切な数値に正常に解析できます。
ここでDavid M. Kean の投稿を参照してください。これは言語の相互運用性の問題のようです:
C# では、ユーザーが FlagsAttribute を使用せずに列挙型に対してビット操作を実行できますが、Visual Basic ではそうではありません。したがって、型を他の言語に公開する場合は、列挙型を FlagsAttribute でマークすることをお勧めします。また、列挙型のメンバーが一緒に使用するように設計されていることも明確になります。
よろしく
デビッド
具体的な動作の違いのリストを次に示します。
内部で何をしているのかと尋ねると、私の知る限り、それは ToString() メソッドを変更するだけで、他には何もありません。
.Net 4では、特定のフラグをチェックするHasFlags メソッドがあります。msdn を正しく解釈すると、このメソッドを使用するには flags-attribute を使用する必要があります。しかし、私はそれを試していません。
実際、私が使用する用途の1つは、複数のステータスを示すことです。これは、テスト結果を評価するいくつかのコードを単純化したものです。テストはOKである場合もあれば、OKでない理由がいくつかある場合もあります。これがもたらす利点は、テスト「OK-ness」を評価する1つのメソッドがあり、そのメソッドが1回のリターンですべての考えられる障害状態を示すことができることです。最良の設計ではないかもしれませんが、この場合は機能します。
[Flags]
public enum ResultStatusEnum
{
Ok = 0x1,
SampleInvalid = 0x2,
DirectionInvalid = 0x4,
TestIsNotValid = 0x8
}
次のように設定します。
ResultStatusEnum res = ResultStatusEnum.SampleInvalid | ResultStatusEnum.DirectionInvalid;
欠点は、列挙型の値をチェックするのが面倒になることです。これは(必然的に)機能しません:
res == ResultStatusEnum.Ok
あなたはチェックするためにこれをしなければなりません:
ResultStatusEnum.SampleInvalid == (res & ResultStatusEnum.SampleInvalid)
この場合、持つのは非論理的ResultStatusEnum.Ok & ResultStatusEnum.SampleInvalidですが、列挙型を使用する場合ではないことを確認します。