Reputation: 13872
Today I had a discussion with my colleague and concluded following points. Kindly throw some light if all are correct or some modification is required.
Upvotes: 35
Views: 66380
Reputation: 23973
1.-3.You cannot exactly know when it happens and so you cannot depend on it. A static constructor will give you a little control what happens when it get called.
public class UtilityClass
{
//
// Resources
//
// r1 will be initialized by the static constructor
static Resource1 r1 = null;
// r2 will be initialized first, as static constructors are
// invoked after the static variables are initialized
static Resource2 r2 = new Resource2();
static UtilityClass()
{
r1 = new Resource1();
}
static void f1(){}
static void f2(){}
}
4.Static constructors are slow
The exact timing of static constructor execution is implementation-dependent, but is subject to the following rules:
Upvotes: 18
Reputation: 6286
All of your points are correct.
The reason static constructors should be avoided is because the compiler injects code everywhere any method of the class is called to check that the static constructor has been called. This has a negative impact on performance.
What you can do is have a private static field in you class that is assigned a dummy value when the default (or other non static) constructor is called. This initializes all static fields on object creation.
Upvotes: 8