2010-12-01 12 views
3

Ich bin gerade entzwei Wrapper einen Open-Source-.NET und sah dies:Was genau bedeutet das in C#?

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

Was ist genau die 'Flag' Dekorateur bedeuten? (Wird es 'Dekorateur' genannt?)

Auch was bedeutet die kurze am Ende der Enum-Deklaration?

Danke!

+0

Woops! Vergessen, den Code zu formatieren! –

+0

Es heißt Attribut. Siehe [FlagsAttribute] (http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx) –

Antwort

1

short ist ein weiteres Schlüsselwort für System.Int16, eine Zwei-Byte-Ganzzahl von -32.768 bis 32.767. Standardmäßig ist der Basistyp einer Aufzählung int. In diesem Fall versuchen sie, einen kleineren Datentyp zum Speichern der Enumeratorwerte zu verwenden.

1

Dies macht eine Aufzählung ein Bit-Flag.
Es bedeutet, dass Sie einzelne Werte miteinander kombinieren können.
Like:

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

der sie einen Wert von 7

Einzelne Aufzählungswerte geben würde, haben in der Regel einen Wert von 2^n. Aber können auch kombiniert werden wie:

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

    LeftAndRight = 3, 
    UpAndDown = 12, 

    AllSides = 15 
} 
0

Flags ist ein Attribut; speziell, System.FlagsAttribute.

Es bedeutet, dass der Compiler Sie Werte vom Typ TwDG als Bit-Feld verwenden können, das heißt, speichern, wie viele von ihnen, wie Sie in einem Wert wie folgt wollen:

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

Typischerweise wird dies getan Wenn ein Code verschiedene (oder optionale) Aktionen ausführen muss, abhängig davon, ob eines dieser Flags gesetzt ist. Nehmen wir zum Beispiel an, wir möchten den Inhalt einer Videodatei beschreiben, die Audio und Bild enthalten kann. Man könnte schreiben:

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

Wenn Sie dann, wenn die Datei überprüfen wollte eine Audiospur enthält, Sie „auswählen“, um die Audio Flagge wie dies würde:

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

Mit dem Compiler können Sie all dies trotzdem tun, ohne das Attribut Flags. Flags steuern das Parsen und Formatieren, das ist alles. –

+0

Ich stehe korrigiert. Klassisches Beispiel für Upgrades "Das würde ich nie machen" bis "* offensichtlich * der Compiler lässt mich das nicht". – Jon

8

Die Flags Attribute verwendet wird erlauben und dekorieren Sie die Aufzählung für bitweise mathematische Operationen auf Enum-Werten.

Dadurch können Sie sie zusammen oder andere Operation Elemente hinzufügen.

Der kurze Teil es als Short definiert anstatt eine ganze Zahl ist, ausführlich über das ist auch in der verknüpften URL

+3

Dies ist nicht absolut korrekt. Sie können das Bit-Spiegeln ohne das Attribut ausführen. Sie können mit ToString() aber auch aus kombinierten Elementen drucken. –

+1

@chibacity: Wenn Sie keinen Code-Verschleierungs-Wettbewerb eingeben, empfehle ich dringend, dies zu vermeiden. –

+2

@Code Ich bin mir nicht sicher, ob ich dir folge. Die Antwort besagt, dass es "erforderlich" ist. Es ist nicht. Ich befürworte hier keine Best-Practice. –

0

Ich habe sie zuvor Dekoratoren genannt (und es ist akzeptabel, sie als solche in der Gemeinde zu bezeichnen), aber aus Gründen der Argumente und streng genommen; Es ist ein Attribut. Es wird verwendet, um die Enumeration als Bit-Flag-Typ zu "markieren".
Hier ist die MSDN Reference.

0

Was [Flag] - Daten Zeit, die ENUM-Werte zu speichern, verwendet - Sie sollten hier link text

Kurz aussehen.

2

Es bedeutet, dass Sie einen Hinweis geben, dass dieser Enum für "bitweise oder" Operationen

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 

Weitere Daten verwendet werden FlagAttribute

(in Framework 4.0 Enum.HasFlag hinzugefügt wurde)

Short sagt: Dieser Back-Type für diese Enumeration ist nicht int (was Standardoption für enums ist), sondern kurz. Sie können auch long, ushort oder einen anderen integrierten Integer-Typ angeben.

3

Es ist ein Attribut. Obwohl andere gesagt haben, dass es notwendig ist, Bit-Flip-Operationen mit der Enumeration durchzuführen, trifft dies nicht zu. Sie können dies mit enums ohne dieses Attribut tun.

Wenn Sie das Attribut angewendet haben, erhalten Sie eine andere ToString() - Ausgabe auf der Aufzählung, die die kombinierten Elemente eines Aufzählungswerts, z. "Blau | Rot | Orange" statt "7".

Das Schlüsselwort "short" bedeutet, dass der Typ für die Enum-Elemente 16-bit signed integer ist.