Czytałem o wyliczeniach i stwierdziłem, że są bardzo podobne do deklarowania stałych. Skąd mam wiedzieć, kiedy użyć stałej, a nie wyliczenia, lub odwrotnie. Jakie są zalety używania wyliczeń?
c#
language-agnostic
enums
Draco
źródło
źródło
Odpowiedzi:
Użyj wyliczeń, gdy chcesz zdefiniować zakres wartości, które mogą być. Kolor jest oczywistym przykładem:
public enum Colour { White, Red, Blue }
A może zestaw możliwych rzeczy, takich jak: (Przykład, który ukradłem stąd, ponieważ jestem leniwy)
[FlagsAttribute] enum DistributedChannel { None = 0, Transacted = 1, Queued = 2, Encrypted = 4, Persisted = 16, FaultTolerant = Transacted | Queued | Persisted }
Stałe powinny dotyczyć jednej wartości, np. PI. Nie ma zakresu wartości PI, jest tylko PI.
Inne kwestie do rozważenia to:
źródło
.ToString()
często wyliczenia, jakiejkolwiek wartości w używaniu klasy z ciągami stałymi, która wygląda i działa jak wyliczenie, ale omija wywołanieToString()
? PrzykładType Safety"
W innych odpowiedziach brakuje tego, że wyliczenia mają bazowy typ całkowity. Możesz zmienić wartość domyślną z int na dowolny inny typ całkowity z wyjątkiem char, na przykład:
enum LongEnum : long { foo, bar, }
Można rzutować jawnie zi niejawnie na typ podstawowy, co jest przydatne w instrukcjach przełączania. Pamiętaj, że można rzutować dowolną wartość typu podstawowego na wyliczenie, nawet jeśli wyliczenie nie ma elementu członkowskiego o odpowiedniej wartości. Dlatego używanie zawsze domyślnej sekcji przełącznika jest dobrym pomysłem. BTW, sam .NET pozwala nawet na wyliczenia o wartościach zmiennoprzecinkowych, ale nie można ich zdefiniować w C #, chociaż myślę, że nadal można ich używać (z wyjątkiem przełącznika).
Ponadto stosowanie wyliczeń zapewnia większe bezpieczeństwo typów. Jeśli zamierzasz użyć np. Stałych int jako parametrów metody, to mógłbym wywołać metodę z dowolną wartością int. Owszem, przez rzutowanie może się to zdarzyć również w przypadku wyliczeń, ale nie stanie się to przypadkowo. Gorzej jest z możliwością pomylenia kolejności parametrów.
void method(int a, int b) {...}
Jeśli tylko stała A może przejść do a, a stała B tylko do b, to użycie dwóch różnych typów wyliczeń ujawni wszelkie nadużycia podczas kompilacji.
źródło
Stała to funkcja języka, która mówi, że zmienna nie zmieni wartości (więc kompilator może dokonać optymalizacji wokół tej wiedzy), gdy wyliczenie jest określonym typem.
Stałe mogą mieć dowolny typ danych, ale wyliczenie jest wyliczeniem.
Używam wyliczenia w każdym miejscu, w którym możesz mieć wiele opcji i chcesz poprawić czytelność kodu. tj. możesz mieć poziomy śledzenia jako int z wartościami 0, 1, 2 lub jako wyliczenie jako błąd, ostrzeżenie i informacje.
Enum mogą być również używane jako operatory bitowe, np. FontStyle.Bold | FontStyle.Italic zapewni czcionki pogrubione i pochylone.
źródło
Oprócz odpowiedzi Roberta:
Użyj enum dla skończonego zestawu nazwanych wartości. Nie przejmujesz się wartościami liczbowymi za każdym symbolem (ale nadal masz możliwość ich narzucenia, np. W celu zgodności ze starszym systemem).
Robert: Tak, Enum mogą być używane jako pola bitowe. Użyj atrybutu Flags (i upewnij się, że elementy członkowskie wyliczenia mają odpowiednie wartości liczbowe).
źródło
Stała AC # jest podobna do zmiennej, ponieważ nadaje zdefiniowanej nazwie wartości. Jednak stała różni się od zmiennej standardowej, ponieważ raz zdefiniowana wartość przypisana do stałej nigdy nie może zostać zmieniona. Główną zaletą stałych jest ich pomoc w tworzeniu samodokumentującego się kodu, a także umożliwienie deklaracji kluczowych wartości w jednym miejscu, co pozwala na łatwą obsługę w przypadku konieczności aktualizacji wartości i ponownej kompilacji oprogramowania.
Natomiast listy Enumerator są przydatne do definiowania sekwencji i stanów, szczególnie gdy następuje naturalny postęp przez te stany. Dzieje się tak, ponieważ każdą stałą na liście można sformatować i porównać przy użyciu jej nazwy lub wartości. Wyliczenia można również użyć do zdefiniowania ograniczonego zestawu prawidłowych wartości.
źródło
Jedną rzeczą, którą uważam za przydatną podczas używania
enum
zamiast tego,const
jest to, że można iterować po wartościach w anenum
, znacznie trudniej jest to zrobić zconst
wartościami.źródło