2010-12-01 20 views
3

私は、オープンソースの.NET TWAINラッパーを閲覧し、この見ている:「旗」デコレータは正確に何を意味していることC#でこれは正確に何を意味しますか?

[Flags] 
internal enum TwDG : short 
{         // DG_..... 
    Control = 0x0001, 
    Image = 0x0002, 
    Audio = 0x0004 
} 

を? (それは「デコレータ」と呼ばれていますか?)

また、列挙宣言の最後にはどういう意味ですか?

ありがとうございます!

+0

Woops!コードをフォーマットするのを忘れてしまった! –

+0

属性と呼ばれます。 [FlagsAttribute](http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx) –

答えて

1

shortは、System.Int16の別のキーワードで、-32,768〜32,767の2バイトの整数です。デフォルトでは、enumの基本型はintです。この場合、列挙子の値を格納するために、より小さなデータ型を使用しようとしています。

1

これは、列挙をビットフラグにします。
これは、個々の値を組み合わせることができることを意味します。
ように:それを個々の列挙値は、通常2^nの価値を持っている7.

の値を与える

TwDG value = TwDG.Control | TwDG.Image | TwDG.Audio; 

。しかし、同様のように組み合わせることができます

[Flags] 
public enum Sides 
{ 
    Left = 1, 
    Right = 2, 
    Up = 4, 
    Down = 8, 

    LeftAndRight = 3, 
    UpAndDown = 12, 

    AllSides = 15 
} 
0

Flags属性です。具体的にはSystem.FlagsAttributeである。

それはコンパイラは、あなたがこのように一つの値にしたいとそれらの多くのビットフィールド、すなわち、ストアとしてタイプTwDGの値を使用することができますことを意味します

通常
var control = TwDG.Control; 
var allTogether = TwDG.Control | TwDG.Image | TwDG.Audio; 

、これが行われますこれらのフラグの1つが設定されているかどうかによって、いくつかのコードが異なる(またはオプションの)アクションを取る必要があるときです。たとえば、オーディオや画像を含むビデオファイルの内容を記述したいとします。 、そして、

var imageAndAudio = TwDG.Image | TwDG.Audio; 
var muteImage = TwDG.Image; 

を使用すると、ファイルにオーディオトラックが含まれているかどうかを確認したい場合、あなたはこのようにAudioフラグを「選ぶ」なります:あなたは書くことができ

var hasAudio = (myValue & TwDG.Audio) != (TwDG) 0; 
+0

コンパイラを使用すると、Flags属性を使用せずに、すべての操作を行うことができます。 Flagsは構文解析と書式設定を制御します。 –

+0

私は訂正しました。 "私は決してそうしません"というアップグレードの古典的な例は、 "明らかに*コンパイラは私にそれをさせません"。 – Jon

8

Flags Attributeをするために使用されますenum値に対するビット単位の数学演算の列挙を許可し、飾ります。

これを行うと、それらを一緒に追加したり、他の操作項目を追加することができます。

ショート一部がショートではなく整数として定義され、この上の詳細は、リンクされたURLにもあり

+3

これは完全に正確ではありません。属性なしでビット反転を実行できます。あなたは、結合されたメンバーのToString()でかなりの印刷を取得します。 –

+1

@chibacity:コードの難読化コンテストに参加していない限り、私はそれを強く推奨します。 –

+2

@コード私はあなたに従うか分からない。答えは「必須」と答えています。そうではない。私はここでベストプラクティスを主張していません。 –

0

以前はデコレータと呼ばれていましたが(コミュニティでも同様にラベル付けすることはできますが)、厳密に言えば、議論のためです。これは属性です。列挙型をビットフラグ型として「マーク」するために使用されます。
ここにはMSDN Referenceです。

0

用として - 列挙値を格納するために使用されるデータの時間、 - あなたはここでlink text

ショートになります。

2

それは、この列挙は、「ビット単位または」操作

var flags = TwDG.Control | TwDG. Image; 
Console.WriteLine(flags.HasFlag(TwDG.Image)); // true 
Console.WriteLine(flags.HasFlag(TwDG.Control)); // true 
Console.WriteLine(flags.HasFlag(TwDG.Audio)); // false 

詳細情報FlagAttributeEnum.HasFlagは、フレームワーク4.0で追加されました)

ショートが言っている、のために使用されることを、あなたはヒントを与えることを意味しこのenumのバックタイプはintではありません(これはenumのデフォルトオプションです)。また、long、ushort、またはその他の整数組み込み型を指定することもできます。

3

これは属性です。列挙型でビットフリッピング演算を実行できるようにする必要があると言われている人もいますが、これは真実ではありません。これは、この属性を持たないenumで行うことができます。

属性を適用すると、enum値の組み合わせメンバーをきれいに印刷するenumに別のToString()出力が得られます。 "Blue | Red | Orange"、 "7"の代わりに。

"short"キーワードは、列挙型メンバーのタイプが16-bit signed integerであることを意味します。