Soci (Soczó Zsolt) szakmai blogja

2010.12.17.

Mi a hiba ebben?

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 12:05

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

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

6 Comments

  1. 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.

    Comment by Érsek Attila — 2010.12.17. @ 12:46

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

    Comment by firestrm — 2010.12.17. @ 13:15

  3. Ja a Random.Next nem thread-safe…

    Comment by firestrm — 2010.12.17. @ 13:31

  4. 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?

    Comment by Tóth Viktor — 2010.12.17. @ 21:49

  5. 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.

    Comment by SebDani — 2010.12.20. @ 09:20

  6. 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.

    Comment by Soczó Zsolt — 2011.01.03. @ 10:52

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress