Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

December 17, 2010 / by Zsolt Soczó

Mi a hiba ebben?

http://www.dofactory.com/Patterns/PatternSingleton.aspx

A mellékelt példakódban valami nem igaz. Mi?

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

6 COMMENTS

  • Érsek Attila December 17, 2010

    Csak tipp, de a 3. példánál írja, hogy a static initialization akkor fut le amikor a típus betöltődik, de ez nem igaz, akkor fut le amikor a típusra először hivatkozunk. A típus az assembly-vel együtt betöltődik, de ettől még nem fut le se a static konstruktor se a az initializer.

    Ez akkor lehet érdekes ha pl a singleton instance pl hostolna egy szolgáltatást. Addig nem indul el a host, amíg a kód legalább 1 helyen nem hivatkozik a típusra.

  • firestrm December 17, 2010

    Én mondjuk egy singleton-nak nem csinálnék protected konstruktort, mert leszármaztatható és publikus konstruktorral ellátható.

  • firestrm December 17, 2010

    Ja a Random.Next nem thread-safe…

  • Tóth Viktor December 17, 2010

    Attila, igen, szerintem is az a komment nem igaz. Mondjuk a példában a LoadBalancer típus before field init-es, szóval nem lehet tudni, hogy pontosan mikor hívódik meg a típuskonstruktor, csak azt, hogy valamikor az első hivatkozás előtt. Másik oldalról, én úgy tapasztaltam (na jó, igazából most próbáltam ki), hogy max az elöször hivatkozó függvény elejére teszi ki a típuskonstruktor hívást a jitter, tehát azért annyira nem messze az első hivatkozástól.
    Belegondolva, ennél messzebb nem is tudná. Különben a jitternek bele kellene nézni a hívási lánc következő szintjeibe, hátha van ott statikus hivatkozás. Ez minden esetben lelassítaná a jitter csak azért, hogy nagyon nagyon ritkán egy-két szintel ki tudjon hozni egy statikus konstruktor hívást, ami ráadásul amúgy is csak akkor okoz teljesítményvesztést, ha valami durva ciklusból sikerült kimenteni, tehát ritka a négyzeten esetben hozna eredményt.
    Másik lehetőség valóban a típus betöltésekor meghívni a before field inites típusok típuskonstruktorait, biztos ennek is megvan az indoka, hogy végül miért nem így működik, de erre nincs ötletem. Gondolom nem akartak feleslegesen lefuttatni egy csomó kódot induláskor, hogy esetlegesen kimentsenek egy ciklusban való ellenőrzést arra, hogy vajon lefutott-e már a típuskonstruktor. Vagy ti tudtok erről valamit?

  • SebDani December 20, 2010

    Az adott kódnak nem az az output-ja, mint ami a lap alján, az Output ablakban szerepel.
    Merthogy a kódban ez van: Console.WriteLine(“Dispatch request to: ” + serverName);
    A “képernyőképen” pedig semmi “Dispatch request to:” szöveg nincs, csak a szervernevek.

  • Soczó Zsolt January 3, 2011

    Köszönöm mindenkinek a válaszokat.

    A Random.Next nem thread safe, azzal gondok lehetnek, ahogy firestrm írta.

    A statikus inicializálást pazarlás lenne meghívni betöltéskor, ezért csak az első hivatkozás környékén teszik meg.