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
0 komentarze:
Prześlij komentarz