Wyobraź sobie, że zdefiniowałem następujący Enum:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Jaka jest najlepsza praktyka korzystania z wyliczenia? Czy powinien zaczynać się 1
od powyższego przykładu, czy od 0
(bez jawnych wartości) w następujący sposób:
public enum Status : byte
{
Inactive,
Active
}
Odpowiedzi:
Wytyczne dotyczące projektowania ram :
Wytyczne dotyczące projektowania ram / projektowanie wyliczeń flag :
źródło
switch
instrukcjach przeskoczy dodefault
sekcji, w której rzucamInvalidEnumArgumentException
. W przeciwnym razie program może niechcący kontynuować działanie z zerową wartością wyliczenia, która może być poprawna i niezauważona.Cóż, myślę, że nie zgadzam się z większością odpowiedzi, które mówią, że nie należy ich wyraźnie numerować. Zawsze jawnie je numeruję, ale dzieje się tak dlatego, że w większości przypadków ostatecznie utrwalam je w strumieniu danych, gdzie są przechowywane jako wartości całkowite. Jeśli nie dodasz jawnie wartości, a następnie dodasz nową wartość, możesz przerwać serializację, a następnie nie będzie można dokładnie załadować starych utrwalonych obiektów. Jeśli masz zamiar dokonać jakiegokolwiek trwałego przechowywania tych wartości, zdecydowanie polecam jawne ustawienie wartości.
źródło
Enum jest typem wartości, a jego wartość domyślna (na przykład dla pola Enum w klasie) będzie wynosić 0, jeśli nie zostanie zainicjowana jawnie.
Dlatego generalnie chcesz mieć 0 jako zdefiniowaną stałą (np. Nieznane).
W twoim przykładzie, jeśli chcesz
Inactive
być wartością domyślną, powinna mieć wartość zero. W przeciwnym razie warto rozważyć dodanie stałejUnknown
.Niektórzy zalecają, aby nie podawać jawnie wartości stałych. Prawdopodobnie w większości przypadków dobra rada, ale w niektórych przypadkach będziesz chciał to zrobić:
Flagi wyliczenia
Wyliczenia, których wartości są używane we współpracy z systemami zewnętrznymi (np. COM).
źródło
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
jest znacznie bardziej czytelny niż[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
spowodowałoby[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, podczas gdy dla Flagi ENUM byś zazwyczaj chcą C = 4.Jeśli nie masz konkretnego powodu, aby to zmienić, pozostaw wyliczenia z ich domyślnymi wartościami, które zaczynają się od zera.
źródło
Powiedziałbym, że najlepszą praktyką jest nie numerowanie ich i pozostawienie ich w domyśle - co zacznie się od 0. Ponieważ jest to niejawne, to preferencja językowa, którą zawsze dobrze jest przestrzegać :)
źródło
Zacząłbym wyliczenie typu boolowskiego od 0.
Chyba że „Nieaktywny” oznacza coś innego niż „Nieaktywny” :)
To zachowuje standard dla tych.
źródło
Powiedziałbym, że to zależy od tego, jak ich używasz. Przy oznaczaniu wyliczenia dobrą praktyką jest przyjmowanie
None
wartości 0 dla wartości, na przykład:Gdy prawdopodobnie wyliczenie zostanie zmapowane do tabeli wyszukiwania bazy danych, zacznę od 1. Nie powinno to mieć większego znaczenia dla profesjonalnie napisanego kodu, ale poprawia to czytelność.
W innych przypadkach zostawiłbym to tak, jak jest, nie dbając o to, czy zaczynają się od 0, czy 1.
źródło
O ile nie masz dobrego powodu, aby używać surowych wartości, powinieneś zawsze używać niejawnych wartości i odwoływać się do nich za pomocą
Status.Active
iStatus.Inactive
.Problem polega na tym, że możesz chcieć przechowywać dane w pliku prostym lub bazie danych albo użyć pliku płaskiego lub bazy danych utworzonej przez kogoś innego. Jeśli robisz to sam, zrób to tak, aby numeracja była zgodna z tym, do czego służy Enum.
Jeśli dane nie są twoje, oczywiście będziesz chciał użyć tego, co pierwotny programista użył jako schematu numeracji.
Jeśli planujesz używać Enum jako zestawu flag, istnieje prosta konwencja, której warto przestrzegać:
Wartości powinny być potęgami dwójki i mogą być wyrażone przy użyciu operacji przesunięcia bitowego.
None
oczywiście powinno0
, aleAll
jest to mniej oczywiste-1
.~0
jest binarną negacją0
i skutkuje liczbą, dla której każdy bit jest ustawiony na1
, który reprezentuje wartość-1
. W przypadku flag złożonych (często używanych dla wygody) inne wartości mogą być łączone przy użyciu operatora bitowego lub|
.źródło
Nie przypisuj żadnych numerów. Po prostu używaj go tak, jak powinien być używany.
źródło
Jeśli nie zostanie określony, numeracja zaczyna się od 0.
Ważne jest, aby być jawnym, ponieważ wyliczenia są często serializowane i przechowywane jako int, a nie ciąg.
Dla każdego wyliczenia przechowywanego w bazie danych zawsze jawnie numerujemy opcje, aby zapobiec przenoszeniu i ponownemu przypisywaniu podczas konserwacji.
Według firmy Microsoft zalecaną konwencją jest użycie pierwszej opcji zerowej do reprezentowania niezainicjowanej lub najczęściej używanej wartości domyślnej.
Poniżej znajduje się skrót do rozpoczynania numeracji od 1 zamiast 0.
Jeśli chcesz ustawić wartości flag w celu użycia operatorów bitowych na wartościach wyliczeniowych, nie rozpoczynaj numerowania od wartości zerowej.
źródło
Jeśli zaczniesz od 1, możesz łatwo policzyć swoje rzeczy.
Jeśli zaczniesz od 0, użyj pierwszej jako wartości dla rzeczy niezainicjowanych.
źródło
Po pierwsze, jeśli nie określasz konkretnych wartości z jakiegoś powodu (wartość liczbowa ma znaczenie gdzie indziej, np. Baza danych lub usługa zewnętrzna), nie określaj w ogóle wartości liczbowych i pozwól im być jawne.
Po drugie, zawsze powinieneś mieć element o wartości zerowej (w wyliczeniach bez flag). Ten element będzie używany jako wartość domyślna.
źródło
Nie rozpoczynaj ich od 0, chyba że jest ku temu powód, na przykład używanie ich jako indeksów do tablicy lub listy, lub jeśli istnieje inny praktyczny powód (np. Używanie ich w operacjach bitowych).
Twój
enum
powinien zacząć dokładnie tam, gdzie powinien. Nie musi też być sekwencyjny. Wartości, jeśli są wyraźnie określone, muszą odzwierciedlać pewne znaczenie semantyczne lub praktyczne rozważania. Na przykładenum
„butelki na ścianie” powinny być ponumerowane od 1 do 99, podczas gdyenum
dla potęg 4 powinno się prawdopodobnie zaczynać od 4 i kontynuować od 16, 64, 256 itd.Ponadto dodanie elementu o wartości zerowej do elementu
enum
należy wykonać tylko wtedy, gdy reprezentuje prawidłowy stan. Czasami „brak”, „nieznany”, „brak” itp. Są prawidłowymi wartościami, ale często tak nie jest.źródło
Lubię zaczynać wyliczenia od 0, ponieważ jest to ustawienie domyślne, ale lubię też dodawać nieznaną wartość o wartości -1. To wtedy staje się domyślne i może czasami pomóc w debugowaniu.
źródło