Enum

Bryczka z flagami
    public enum Kolorki
    {
        None ,
        Black ,
        Red ,
        Green ,
        Blue 
    };
Koń jaki jest każdy widzi. A co jeśli byśmy chcieli mieć bryczkę z kiloma końmi?
Pamięć przywiodła mi myśl o bitach, ale pomyślałam sobie - że niby nie ma czegoś nowszego i elegantszego?
   [FlagsAttribute] 
    public enum Kolorki
    {
        None ,
        Black ,
        Red ,
        Green ,
        Blue 
    };
    //Kolorki.Green = Kolorki.Black | Kolorki.Red
Świetnie bryczka z flagami. Tylko że:
po wybraniu konika "zielonego" dostajemy - parę "czerwony, czarny", a to z powodu tego że możliwości ponumerują się po kolei.
Więc wracam do opcji bitowej.
  public enum Kolorki
    {
        None = 0,
        Black = 1,
        Red = 2,
        Green = 4,
        Blue = 8
    };
Świetnie zielony jest zielony. Ponieważ wartości na siebie nie nachodzą.
Jednak Black | Green daje ... 5
   [FlagsAttribute] 
    public enum Kolorki
    {
        None = 0,
        Black = 1,
        Red = 2,
        CzarnoCzerwony = Black | Red,
        Green = 4,
        Blue = 8
    };
Dopiero połączenie opcji daje pożądane od początku efekty, więcej nawet możemy sobie deklarować pośrednie wartości.
Hmm no tak ale teraz trzeba jakoś się dostać do wartości w zmiennej, ponieważ zazwyczaj chcemy się dowiedzieć czy coś jest konkretnego koloru.
Z odsieczą przychodzą operacje bitowe.
public bool EnumVariableContains(Kolorki combined, Kolorki checking)
{
     return ((combined & checking) == cheking);
}
Pozostaje kwiestia pozbycia się jednego ze złączonych kolorków:
 private void SomeSome()
{
   Kolorki c = Kolorki.Green | Kolorki.Red;
   //nie chcemy czerwonych
   c = c & ~Kolorki.Red
}
Na zakończenie link to malej dyskusji StackOverFlow i innego posta gdzie łądnie narysowano bitki ;) Wimdows.Net

Komentarze

Popularne posty