Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

arkadiusz.wasniewski

Wartość domyślna Enum

Typy wyliczane umożliwiają zdefiniowanie dozwolonych wartości, które może przyjmować zmienna, parametr metody etc. w trakcie wykonania programu. Każdy ze zdefiniowanych elementów posiada odpowiadającą mu wartość liczbową typu całkowitego. Pierwszy element domyślnie przyjmuje wartość zero. Oczywiście możemy zmienić nie tylko wartość domyślną pierwszego elementu, ale również wszystkich poszczególnych elementów typu. Poniżej prosty przykład, w którym wyliczanie rozpoczynamy od liczby trzy:

    internal enum DocumentType : byte

    {

        Receipt = 3,

        Invoice,

        DeliveryNote,

        CustomerPayment,

        VendorPayment,

        PurchaseOrder

    }

Co jednak się stanie w sytuacji jeśli nie zainicjujemy zmiennej typu wyliczanego? W dokumentacji napisane jest: "The default value of an enum E is the value produced by the expression (E)0". Cóż to oznacza? Otóż w przypadku braku zainicjowania zmiennej zostanie jest przypisana wartość domyślna typu liczbowego czyli zero! To zaś oznacza, iż w takiej sytuacji jesteśmy poza zakresem. Morał z tego taki, iż warto jednak zaczynać wyliczanie zawsze posiadając wartość domyślną.

    internal enum DocumentType : byte

    {

        None,

        Receipt = 3,

        Invoice,

        DeliveryNote,

        CustomerPayment,

        VendorPayment,

        PurchaseOrder

    }

Czyli na przykład tak jak powyżej.

Opublikowane 18 listopada 2008 22:39 przez arkadiusz.wasniewski
Filed under:

Komentarze:

 

Bysza said:

Czyli "advanced basics"? ;)

listopada 18, 2008 23:21
 

arkadiusz.wasniewski said:

To jedna z tych rzeczy, które są oczywiste dopóki nie przestaną działać. Read The F***ing Manual ;-0

listopada 19, 2008 10:38
 

Wojciech Gebczyk said:

- I nie tylko defaultowa wartosc to problem. Nawet posiadajac pole o wartosci 0 w enumie, to i tak np: przy deserializacji mozemy dostac wartosc "kosmiczna" poza zakresem.

Dlatego warto walidowac wartosc czy jest w zakresie i w switchach na enumie dawac default: throw new ArgumentOutOfRangeEx().

PS: Oczywiscie gdzie to ma sens.

- Innym problemem moze byc to ze cast enuma na liczbe, powoduje wkompilowanie stalej czyli "(int)State.Ready" da nam np: "2". po zmianie enuma ("Ready = 22") i rekompilacji moze sie okazac ze to nie ten sam enum, czyli nadal wartosc "2"

PPS: Tym razem do dobrego textu... chyba ;-)

listopada 19, 2008 23:19
 

arkadiusz.wasniewski said:

Ja bym taką walidację wykonywał chyba tylko w trybie DEBUG. Z tego co pamiętam bardzo obciążeniowe czasowo są mechanizmy sprawdzające - dużo refleksji. Chociaż jak nie jest to akurat fragment krytyczny jeśli chodzi o wydajność to nie ma stresu.

listopada 20, 2008 10:49
 

nuwanda said:

Dla ciekawych tematu polecam blog Krzysztofa Cwaliny a w szczególności wpis o enumach: http://blogs.msdn.com/kcwalina/archive/2004/05/18/134208.aspx

Polecam też jego książkę "Framework Design Guidelines", której uaktualnione drugie wydanie niedawno się pojawiło.

listopada 20, 2008 11:01
 

arkadiusz.wasniewski said:

No. Ten wpis na blogu Cwaliny zawiera wszystko co trzeba.

listopada 20, 2008 11:45
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems