Static Constructors
Automatic Invocation of Static Constructors:
Static constructors are invoked automatically by the runtime
when a static member of the class is accessed for the first time, or when a
static method is called. This ensures the class is properly initialized before
any operations are performed on it. For example, if the static constructor
initializes some static fields or resources, it will run as soon as the class
is accessed.
No Parameters:
A static constructor cannot accept parameters. It is
designed specifically to initialize static members or to perform one-time setup
tasks. This limitation ensures that static constructors are controlled solely
by the runtime, and cannot be influenced by other code that might pass
parameters to them.
Thread Safety:
Static constructors are thread-safe. The runtime guarantees
that even if multiple threads try to access the class simultaneously, the
static constructor will be executed only once. This ensures that the
initialization process is safe and doesn't lead to race conditions or
inconsistent states in your static members.
Private by Default:
Static constructors are private by default and cannot be
explicitly called by code. The runtime automatically invokes them when needed,
preventing any possibility of manually triggering a static constructor, which
would violate its intended purpose. This also avoids unintended side effects
when the class is used.
Exception Handling:
If a static constructor throws an exception, the class will
be left in an uninitialized state. This prevents further usage of the class,
and any subsequent attempts to use it will throw a TypeInitializationException.
This exception prevents the class from being used improperly after it has
failed to initialize.
Static Classes:
A static class in C# can only contain static members, and it
can only have a static constructor. Since you cannot instantiate a static
class, the only constructor available is the static one. Static classes are
typically used to group utility methods or constants. Here's the provided
example of a static class:
Example:
public static class Utility
{
static Utility()
{
Console.WriteLine("Static constructor called.");
}
public static void
DoWork()
{
Console.WriteLine("Doing work...");
}
}
In this example, the static constructor initializes or
performs some setup when the class is accessed for the first time.
Static Constructors in Non-Static Classes:
Non-static classes can also have static constructors. These
are used for initializing static members or performing one-time setup tasks
before any instance of the class is created. Here's the example you've
provided, which demonstrates both a static constructor and an instance
constructor:
Example:
public class MyClass
{
public static int
StaticField;
public int
InstanceField;
// Static
constructor
static MyClass()
{
StaticField =
100;
Console.WriteLine("Static constructor called.");
}
// Instance
constructor
public MyClass(int
value)
{
InstanceField
= value;
Console.WriteLine("Instance constructor called.");
}
}
class Program
{
static void Main()
{
// Static
constructor is called here.
Console.WriteLine(MyClass.StaticField);
MyClass obj =
new MyClass(200); // Instance constructor is called here.
Console.WriteLine(obj.InstanceField);
}
}
In this example:
- The
static constructor initializes the static field StaticField before
any instance of MyClass is created.
- The
instance constructor initializes the InstanceField when an
object of MyClass is instantiated.
- The
static constructor will only run once when a static member is accessed,
while the instance constructor runs each time an object is created.
Default Static Constructor:
- If
no static constructor is defined, the compiler will automatically generate
a default static constructor. This default constructor does not perform
any specific actions, but ensures that any necessary initialization of
static members happens before the class is accessed.
Conclusion:
Static constructors in C# are crucial for ensuring that
static members are initialized or that one-time setup is performed. The key
points are:
- They
are automatically invoked the first time a static member is accessed.
- They
are thread-safe and private by default.
- They
cannot take parameters and are controlled by the runtime.
- They
ensure that static classes or static members are correctly initialized
before use.
Comments
Post a Comment