Czy w języku C # można ozdobić typ Enum atrybutem lub zrobić coś innego, aby określić, jaka powinna być wartość domyślna, bez zmiany wartości? Wymagane liczby mogą być ustawione w kamieniu z jakiegokolwiek powodu, i przydałoby się mieć kontrolę nad ustawieniami domyślnymi.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
int
s abstrakcyjnie , po prostu dlatego, że są one zaimplementowane jako typy numeryczne. Możemy zaimplementować wyliczenia jako ciągi i nie zmieniłoby to ich przydatności. Uważam tutaj odpowiedź za ograniczenie ekspresji języka C #; ograniczenie z pewnością nie jest nierozerwalnie związane z ideą „odróżniania wartości od ograniczonego zbioru”.enum
s jako konstrukcjach na poziomie typu, a konkretnie jako o typach sum (lub patrz tutaj . To znaczy, uważaj każdy wyliczenie za odrębny typ, gdzie wszystkie wartości tego typu są różne od wartości pozostałych wyliczeń. Z takiego sposobu myślenia wyliczenia nie mogą dzielić żadnej wartości i rzeczywiście, ta abstrakcja rozpada się, gdy weźmie się pod uwagę, że domyślna wartość0
danego wyliczenia może, ale nie musi być, i jest po prostu uzewnętrzniona w każdym wyliczeniu.Odpowiedzi:
Domyślną wartością
enum
(w rzeczywistości dowolnego typu wartości) jest 0 - nawet jeśli nie jest to poprawna wartośćenum
. Nie można tego zmienić.źródło
Domyślna wartość dowolnego wyliczenia wynosi zero. Jeśli więc chcesz ustawić jeden moduł wyliczający na wartość domyślną, ustaw ten jeden na zero, a wszystkie inne elementy wyliczające na niezerowe (pierwszy moduł wyliczający, który ma wartość zero, będzie wartością domyślną dla tego wyliczenia, jeśli istnieje kilka modułów wyliczających o wartości zero).
Jeśli twoje moduły wyliczające nie potrzebują jawnych wartości, upewnij się, że pierwszy moduł wyliczający jest tym, który ma być domyślnym urządzeniem wyliczającym, ponieważ „Domyślnie pierwszy moduł wyliczający ma wartość 0, a wartość każdego kolejnego modułu wyliczającego jest zwiększana o 1. ” ( Odniesienie C # )
źródło
Jeśli zero nie działa jako poprawna wartość domyślna, możesz użyć modelu komponentu do zdefiniowania obejścia dla wyliczenia:
a następnie możesz zadzwonić:
Uwaga: w górnej części pliku należy umieścić następujący wiersz:
Nie zmienia to faktycznej wartości domyślnej wyliczenia w języku C #, ale umożliwia wskazanie (i uzyskanie) żądanej wartości domyślnej.
źródło
else
oświadczeniu w następujący sposób:return default(TEnum);
. Pięść, zmniejszy wolniejszeEnum.GetValues(...).***
połączenia, po drugie (i co ważniejsze) będzie ogólny dla każdego rodzaju, nawet nie-enum. Poza tym nie ogranicza się kodu, który ma być używany tylko dla wyliczeń, więc faktycznie naprawi to potencjalne wyjątki, gdy jest używany w przypadku typów innych niż wyliczanie.Domyślną wartością wyliczenia jest dowolne wyliczenie równe zero. Nie sądzę, że można to zmienić atrybutem lub w inny sposób.
(MSDN mówi: „Domyślną wartością wyliczenia E jest wartość wytworzona przez wyrażenie (E) 0”.)
źródło
Nie możesz, ale jeśli chcesz, możesz zrobić jakąś sztuczkę. :)
użycie tej struktury jako prostego wyliczenia.
gdzie możesz domyślnie utworzyć pa == Orientation.East (lub dowolną inną wartość),
aby użyć samej lewy, musisz przekonwertować z int przez kod.
tam wdrożenie:
źródło
value + 1
, w przeciwnym razie teraz Twojedefault(Orientation)
zwrotyEast
. Ustaw też konstruktor jako prywatny. Dobre podejscie.Jeszcze jeden sposób, który może być pomocny - użycie pewnego rodzaju „aliasu”. Na przykład:
źródło
Status s = default(Status);
nie będzie żadnym członkiem statusu, ponieważs
będzie miało wartość(Staus) 0
. Ta ostatnia jest ważna do pisania bezpośrednio, ponieważ wyliczenia mogą być rzutowane na liczby całkowite, ale zawiedzie podczas deserializacji, ponieważ struktura zapewnia, że wyliczenie jest zawsze deserializowane do ważnego elementu. Twój kod będzie całkowicie poprawny, jeśli zmienisz wierszNew = 10
naNew = 0
.W rzeczywistości wartością
enum
domyślną jest pierwszy element,enum
którego wartością jest0
.Na przykład:
źródło
Console.WriteLine(Animals.Pony);
Drukuje „Cat”)The default value of enum is the enummember equal to 0 or the first element(if value is not specified)
... Ale napotkałem krytyczne problemy z wykorzystaniem enum w moich projektach i przezwyciężyłem, robiąc coś poniżej ... Jakkolwiek moja potrzeba była związana z poziomem klasy ...i uzyskaj oczekiwany wynik
Co jeśli wartość pochodzi z DB ... Ok w tym scenariuszu ... przekaż wartość w poniższej funkcji i przekonwertuje wartość na wyliczoną ... poniżej funkcja obsłużyła różne scenariusze i jest ogólna ... i wierz mi, że to jest bardzo szybki ..... :)
źródło
Wartość domyślna dla typu wyliczenia wynosi 0:
„ Domyślnie pierwszy moduł wyliczający ma wartość 0, a wartość każdego kolejnego modułu wyliczającego jest zwiększana o 1. ”
„ Wyliczenie typu wartości ma wartość wytworzoną przez wyrażenie (E) 0, gdzie E jest identyfikatorem wyliczenia. ”
Możesz sprawdzić dokumentację dla enum C # tutaj , a dokumentację dla wartości domyślnych C # tutaj .
źródło
Jeśli zdefiniujesz domyślny wyliczenie jako wyliczenie o najmniejszej wartości, możesz użyć tego:
Nie zakłada to, że wyliczenie ma wartość zerową.
źródło
Domyślnie jest to pierwszy w definicji. Na przykład:
To wróci
His
źródło
Jeśli ustawisz właściwość na null, zwróci Orientations.None on get. Właściwość _orientation ma domyślnie wartość NULL.
źródło
Następnie w kodzie możesz użyć
źródło