Niesforny statyczny konstruktor w C#

Wpis bardziej ‘ku pamięci’, ale może komuś zaoszczędzić kłopotów ;-)

Załóżmy, że mamy taki oto kod:

    class First
    {
        static First()
        {
            Console.WriteLine("First static constructor");
        }

        public static void DoSth()
        {
            Console.WriteLine("Let's do sth");
        }
    }

    class Second : First
    {
        static Second()
        {
            Console.WriteLine("Second static constructor");
        }
    }

Jeśli wywołamy metodę First.DoSth() w outpucie otrzymamy:

First static constructor
Let's do sth

Jeśli jednak spróbujemy z Second.DoSth() otrzymamy… to samo?! A gdzie wykonanie statycznego konstruktora klasy Second? Wszak w dokumentacji MSDN możemy przeczytać:

A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.

I… to się zgadza! Podejrzyjmy Reflectorem jak kompilator zbudował aplikację:

W związku z tym, iż metoda DoSth() jest w klasie First, kompilator ‘olewa’ nasze wywołanie przez klasę Second, przez co statyczny konstruktor tej drugiej się nie wykona. Jest to o tyle niebezpieczne (co sam w swoim kodzie ‘przetestowałem’), że jeśli metoda DoSth() jest w jakikolwiek sposób zależna od wyniku statycznego konstruktora (a wcześniej nic i nikt nie odwoływał się do Second), to możemy spędzić trochę czasu na szukaniu błędu…

3 Responses to “Niesforny statyczny konstruktor w C#”


  1. 1 wkozi

    To dowodzi tylko, że trzeba znać język, w którym się pisze. Niestety większości z nas tylko się wydaje, że wiedzą co piszą. Podobnie jak ze znajomością języka naturalnego.

  2. 2 klm_

    Wszystko dziala tak jak nalezy. Poniewaz metoda DoSth() jest w klasie First klasa Second nie jest w ogole inicjowana, nawet jak bys zrobil Second.DoSth(), bedzeisz miec to samo. To jest logiczne podejscie.

  3. 3 SkyKnight

    Właśnie o tym napisałem post – chciałem na to zwrócić uwagę :-)

Leave a Reply