29

申請[Flags]って実際どうなの?

の動作を変更することは知っていますがEnum.ToString、他に何かしますか? (例: 異なるコンパイラまたは実行時の動作など)


編集:ええ、列挙型がビットごとのフラグとして使用されることを意図しており、それをビットフラグに適用する方がより論理的であるという事実が文書化されていることは承知しています。ただし、一般的なプログラミングの実践ではなく、具体的な動作の変更についてもっと質問していました。

4

6 に答える 6

29

MSDNの記事から:

Flagsが指定されている場合、ParseメソッドとFormatメソッドは高度な機能を備えていることに注意してください。

同様に、Parseメソッドは、今示したようなコンマ区切りの文字列を適切な数値に正常に解析できます。

于 2011-05-05T19:34:42.990 に答える
17

ここでDavid M. Kean の投稿を参照してください。これは言語の相互運用性の問題のようです:

C# では、ユーザーが FlagsAttribute を使用せずに列挙型に対してビット操作を実行できますが、Visual Basic ではそうではありません。したがって、型を他の言語に公開する場合は、列挙型を FlagsAttribute でマークすることをお勧めします。また、列挙型のメンバーが一緒に使用するように設計されていることも明確になります。

よろしく

デビッド

于 2011-05-05T19:54:09.767 に答える
7

具体的な動作の違いのリストを次に示します。

  • [flags] を含む列挙型を None に設定すると、すべてのフラグがクリアされます。
  • HasFlags メソッドは、この属性が存在する場合にのみ機能します。
  • Devio が言ったように、それは Parse メソッドと Format メソッドの機能を変更します。彼はこの記事にリンクしました。どうやら、デバッガーに表示されることにも影響します。
  • [フラグ] が Web サービスのコード生成に影響を与えているのではないかと思っていましたが、そうではないようです。
  • 明確にするために、[flags] の有無にかかわらず、任意の列挙型でビット単位の操作が許可されます。しかし、それを使用することがベストプラクティスです。

詳細: http://msdn.microsoft.com/en-us/library/ms229062.aspx

于 2011-05-05T19:22:40.587 に答える
5

内部で何をしているのかと尋ねると、私の知る限り、それは ToString() メソッドを変更するだけで、他には何もありません。

.Net 4では、特定のフラグをチェックするHasFlags メソッドがあります。msdn を正しく解釈すると、このメソッドを使用するには flags-attribute を使用する必要があります。しかし、私はそれを試していません。

于 2011-05-05T19:23:21.167 に答える
1

実際、私が使用する用途の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ですが、列挙型を使用する場合ではないことを確認します。

于 2011-05-05T19:32:20.827 に答える