Wyliczenia z pewnością mogą uczynić kod bardziej czytelnym. Jest jeszcze kilka rzeczy, na które należy uważać (przynajmniej w .net)
Ponieważ podstawową pamięcią wyliczenia jest int, domyślną wartością będzie zero, więc należy upewnić się, że 0 jest rozsądną wartością domyślną. (Na przykład struktury mają wszystkie pola ustawione na zero podczas tworzenia, więc nie ma możliwości określenia wartości domyślnej innej niż 0. Jeśli nie masz wartości 0, nie możesz nawet przetestować wyliczenia bez rzutowania na int, co byłoby zły styl.)
Jeśli twoje wyliczenia są prywatne dla twojego kodu (nigdy nie są ujawniane publicznie), możesz przestać czytać tutaj.
Jeśli wyliczenia są publikowane w jakikolwiek sposób w kodzie zewnętrznym i / lub są zapisywane poza programem, rozważ ich jawne numerowanie. Kompilator automatycznie numeruje je od 0, ale jeśli zmienisz układ wyliczeń bez podawania im wartości, możesz skończyć z defektami.
Potrafię legalnie pisać
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Aby temu zaradzić, każdy kod, który używa wyliczenia, którego nie można być pewnym (np. Publiczne API), musi sprawdzić, czy wyliczenie jest prawidłowe. Robisz to przez
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
Jedynym zastrzeżeniem Enum.IsDefined
jest to, że wykorzystuje odbicie i jest wolniejsze. Występuje również problem z wersjonowaniem. Jeśli chcesz często sprawdzać wartość wyliczenia, lepiej będzie wykonać następujące czynności:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
Problem z wersjonowaniem polega na tym, że stary kod może wiedzieć, jak obsłużyć tylko 2 wyliczenia, które masz. Jeśli dodasz trzecią wartość, Enum.IsDefined będzie prawdziwe, ale stary kod niekoniecznie może to obsłużyć. Ups.
Jeszcze więcej zabawy można zrobić z [Flags]
wyliczeniami, a kod weryfikacyjny do tego jest nieco inny.
Ja też pamiętać, że do przenoszenia, należy użyć połączenia ToString()
na wyliczenia i korzystanie Enum.Parse()
podczas czytania ich z powrotem w obu. ToString()
I Enum.Parse()
może obsługiwać [Flags]
enum jest tak dobrze, więc nie ma powodu, aby nie z nich korzystać. Pamiętaj, że to kolejna pułapka, ponieważ teraz nie możesz nawet zmienić nazwy wyliczenia bez możliwego złamania kodu.
Więc czasami musisz zważyć wszystkie powyższe, kiedy zadajesz sobie pytanie Czy mogę uciec tylko z boolem?