W sytuacji, gdy nad danym projektem pracuje większa grupa programistów czasami trudno jest się wystrzec oczywistych błędów. Takim błędem jest zapominanie o domyślnej inicjalizacji zmiennych w przypadku enum-a. Poniżej przedstawiam bardzo prosty przykład:
public enum DzienTygodnia { Poniedzialek = 1, Wtorek = 2, Sroda = 3, Czwartek = 4, Piatek = 5, Sobota = 6, Niedziela = 7 }
Oraz dwa wywołania:
DzienTygodnia dzien = new DzienTygodnia(); System.Console.Out.WriteLine("Dzien: " + dzien); System.Console.Out.WriteLine(); DzienTygodnia dzien2 = DzienTygodnia.Poniedzialek System.Console.Out.WriteLine("Dzien2: " + dzien2); System.Console.Out.WriteLine();
Uruchamiając tak skonstruowany kod otrzymamy następujące wyniki:
Dzien: 0 Dzien2: Poniedzialek
Problem nie wydaje się być skomplikowany, ale potrafi napsuć krwi. Otóż, co się stało. Kompilator inicjalizuje zmienną dzien domyślną wartością 0, która nie jest wymieniona w definicji DzienTygodnia.
Należy też pamiętać, że problem ten występuje w sytuacji gdy używamy DzienTygodnia jako element składowy struktury i klasy:
public struct StructDzienTygodnia { DzienTygodnia dzien; ... public StructDzienTygodnia(DzienTygodnia _dzien) { dzien = _dzien; } public DzienTygodnia Dzien { get { return dzien; } } } public class ClassDzienTygodnia { DzienTygodnia dzien; ... public ClassDzienTygodnia(DzienTygodnia _dzien) { dzien = _dzien; } public DzienTygodnia Dzien { get { return dzien; } } }
W przypadku klasy sytuacja jest zdecydowanie lepsza niż w przypadku struktury. Pomimo faktu, że struktura ma zdefiniowany konstruktor, który zastępuje konstruktor domyślny kompilator pozwala nam na definicję struktury za pomocą konstruktora domyślnego, czyli:
StructDzienTygodnia dzien3 = new StructDzienTygodnia();
Oczywiście jeżeli w tej sytuacji sprawdzi się wartość to będzie ona błędna – 0.
Trochę lepiej ma się sytuacja, gdy użyjemy enum w klasie. Wtedy jeżeli zdefiniujemy własny konstruktor, to nie będziemy mogli użyć domyślnego konstruktora. Kompilator zgłosi błąd. W tej sytuacji problem błędu jest przekazywany poza klasę ponieważ zawsze można przecież stworzyć obiekt w następujący sposób:
ClassDzienTygodnia dzien6 = new ClassDzienTygodnia(new DzienTygodnia());
No ale to jest już raczej świadome działanie programisty.
Ale konkludując. Tworząc dowolny enum zawsze pamiętaj, aby jedną z jego wartości było 0. Dlatego też pierwotna definicja powinna wyglądać następująco:
public enum DzienTygodnia { Blad = 0, Poniedzialek = 1, Wtorek = 2, Sroda = 3, Czwartek = 4, Piatek = 5, Sobota = 6, Niedziela = 7 }
jeśli chodzi o '0′ to warto przeczytać:
http://blogs.msdn.com/b/kcwalina/archive/2004/05/18/134208.aspx
Ja bym niedzielę ustawił na 0 🙂
u mnie DzienTygodnia dzien = DzienTygodnia.Poniedzialek; daje wynik Poniedzialek
I tak powinno być. Zrobiłem mały błąd przyklejając kod.
Teraz już jest ok.
’ dzien2′ da 0 a 'dzien’ da poniedzialek
Pozdrawiam