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…


