Jednym z rozważań dotyczących przypadku użycia, w którym pożądane jest domyślne wyliczenie, jest użycie zmiennej dopuszczającej wartości zerowe. Po odebraniu wartości NULL można ją przetłumaczyć w poprawnej części kodu na wartość domyślną, a ta wartość domyślna nie musi być znana w pozostałej części kodu (która po prostu przechodzi przez wartość NULL).
ErikE
Odpowiedzi:
381
Jest to dowolny element wyliczenia reprezentujący wartość 0. W szczególności z dokumentacji :
Wartość domyślna enum Eto wartość wygenerowana przez wyrażenie (E)0.
Jako przykład weźmy następujące wyliczenie:
enum E
{Foo,Bar,Baz,Quux}
Bez przesłonięcia wartości domyślnych drukowanie default(E)powraca, Fooponieważ jest to element pierwszy.
Jednak nie zawsze jest tak, że 0wyliczenie jest reprezentowane przez pierwszego członka. Na przykład, jeśli to zrobisz:
enum F
{// Give each element a custom valueFoo=1,Bar=2,Baz=3,Quux=0}
Drukowanie default(F)da ci Quuxnie Foo.
Jeśli żaden z elementów wyliczenia nie Godpowiada 0:
enum G
{Foo=1,Bar=2,Baz=3,Quux=4}
default(G)zwraca dosłownie 0, chociaż jego typ pozostaje jako G(jak zacytowano w powyższych dokumentach, rzut na dany typ wyliczenia).
Dzięki, a co z wyliczeniami zdefiniowanymi za pomocą char zamiast int. np. status enum {Aktywny = „A”, Nieaktywny = „I”}
Fernando Torres
3
@Fernando Torres: Nadal 0, chyba że jedna z twoich wartości wyliczenia odpowiada '\0'lub default(char), co jest bardzo mało prawdopodobne, ponieważ default(char)jest to znak NUL, który odpowiada kodowi znaków 0.
BoltClock
(Niepoprawnie?) Założyłem, że użycie DefaultValueatrybutu - coś w rodzaju - System.ComponentModel.DefaultValue(MyEnum.Blah)zmodyfikowałoby zachowanie, default(MyEnum)ale nadal daje 0. Czy nie ma sposobu, aby stworzyć abstrakcję dla enumjego wartości domyślnej?
Craig Silver
2
@Craig Silver: Atrybut DefaultValue ma zastosowanie do właściwości - wyliczenie jest typem i jako takie DefaultValue nie ma wpływu na typ wyliczenia jako całości. Podejrzewam, że możesz obejść ten problem za pomocą metody rozszerzenia, ale lepiej sprawdzić po prostu 0.
BoltClock
11
Myślę, że dość niebezpieczne jest poleganie na kolejności wartości w wyliczeniu i założenie, że pierwszy jest zawsze domyślny. Byłaby to dobra praktyka, jeśli obawiasz się ochrony wartości domyślnej.
enum E
{Foo=0,Bar,Baz,Quux}
W przeciwnym razie wystarczy nieostrożny refaktor zamówienia i masz zupełnie inną wartość domyślną.
Przepraszam, że się mylisz. Założyłem to samo, ale jeśli wstawisz Foopo Barobu Fooi Barbędzie miało wartość 0 i E.Foo == E.Barwróci true. To takie głupie i sprzeczne z intuicją, ale to prawda :(
Odpowiedzi:
Jest to dowolny element wyliczenia reprezentujący wartość
0
. W szczególności z dokumentacji :Jako przykład weźmy następujące wyliczenie:
Bez przesłonięcia wartości domyślnych drukowanie
default(E)
powraca,Foo
ponieważ jest to element pierwszy.Jednak nie zawsze jest tak, że
0
wyliczenie jest reprezentowane przez pierwszego członka. Na przykład, jeśli to zrobisz:Drukowanie
default(F)
da ciQuux
nieFoo
.Jeśli żaden z elementów wyliczenia nie
G
odpowiada0
:default(G)
zwraca dosłownie0
, chociaż jego typ pozostaje jakoG
(jak zacytowano w powyższych dokumentach, rzut na dany typ wyliczenia).źródło
'\0'
lubdefault(char)
, co jest bardzo mało prawdopodobne, ponieważdefault(char)
jest to znak NUL, który odpowiada kodowi znaków 0.DefaultValue
atrybutu - coś w rodzaju -System.ComponentModel.DefaultValue(MyEnum.Blah)
zmodyfikowałoby zachowanie,default(MyEnum)
ale nadal daje 0. Czy nie ma sposobu, aby stworzyć abstrakcję dlaenum
jego wartości domyślnej?Myślę, że dość niebezpieczne jest poleganie na kolejności wartości w wyliczeniu i założenie, że pierwszy jest zawsze domyślny. Byłaby to dobra praktyka, jeśli obawiasz się ochrony wartości domyślnej.
W przeciwnym razie wystarczy nieostrożny refaktor zamówienia i masz zupełnie inną wartość domyślną.
źródło
Foo
poBar
obuFoo
iBar
będzie miało wartość 0 iE.Foo == E.Bar
wrócitrue
. To takie głupie i sprzeczne z intuicją, ale to prawda :(