https://blog.csdn.net/cjolj/article/details/56329230
若一個類中有靜態構造函數,在首次實例化該類或任何的靜態成員被引用時,.NET自動調用靜態構造函數來初始化該類。注意是“首次”,即繼續實例化該類時,不會調用該類的靜態構造函數。
1、實例化時調用靜態構造函數
/// <summary>
/// 靜態構造函數
/// <remarks>
/// Main主函數在類StaticConstructorTest之中:
///
/// 1.程序被加載時,首先初始化了【靜態字段】和【靜態構造器】
/// 【1】調用靜態字段_count;
/// 【2】調用靜態構造函數 static StaticConstructorTest();
/// 【3】調用Main下的obj1代碼;
/// </remarks>
/// </summary>
class StaticConstructorTest
{
private static int _count = 0;
static StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("static constructor.Count is {0}", _count));
}
StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("normal constructor.Count is {0}", _count));
}
static void Main(string[] args)
{
StaticConstructorTest obj1 = new StaticConstructorTest();
StaticConstructorTest obj2 = new StaticConstructorTest();
Console.WriteLine(_count);
Console.ReadKey();
}
}
2、引用靜態成員時調用構造函數
/// <summary>
///
/// 靜態構造函數:引用靜態成員時調用構造函數
///
/// <remarks>
/// Main主函數在類StaticConstructorTest之中:
///
/// 1.在進入main主函數之前,首先初始化了【靜態字段】和【靜態構造器】
/// 【1】調用靜態字段_count;
/// 【2】調用靜態構造函數 static StaticConstructorTest();
///
/// </remarks>
/// </summary>
class StaticConstructorTest
{
private static int _count = 0;
static StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("static constructor.Count is {0}", _count));
}
StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("normal constructor.Count is {0}", _count));
}
static void Main(string[] args)
{
Console.WriteLine(_count);
Console.ReadKey();
}
}
3.實例化時調用靜態構造函數(將主函數移到類外面)
/// <summary>
/// 靜態構造函數
/// <remarks>
/// 注意:Main主函數在類StaticConstructorTest之外:
///
/// 1. 在 obj1 對象被創建前,StaticConstructorTest 加載靜態字段:
/// 【1】調用靜態字段_count;
/// 【2】調用靜態構造函數 static StaticConstructorTest();
/// 【3】調用構造函數 構建obj1;
///
/// 2.如果注釋掉 obj1 和 obj2的構造代碼(即:直接訪問類的靜態屬性時,觸發初始化【靜態字段】和【靜態構造器】)
/// 即:直接調用 訪問類靜態屬性Count的代碼 Console.WriteLine(StaticConstructorTest.Count),
/// 則調用順序:
/// 【1】調用靜態字段_count;
/// 【2】調用靜態構造函數 static StaticConstructorTest();
/// </remarks>
/// </summary>
public class StaticConstructorTest
{
private static int _count = 0;
public static int Count
{
get { return StaticConstructorTest._count; }
}
static StaticConstructorTest() // static ctor
{
_count++;
Console.WriteLine(string.Format("static constructor.Count is {0}", _count));
}
public StaticConstructorTest() // public ctor
{
_count++;
Console.WriteLine(string.Format("normal constructor.Count is {0}", _count));
}
}
class Program
{
static void Main(string[] args)
{
StaticConstructorTest obj1 = new StaticConstructorTest();
StaticConstructorTest obj2 = new StaticConstructorTest();
Console.WriteLine(StaticConstructorTest.Count);
Console.ReadKey();
}
}
4.引用靜態成員時調用構造函數(將主函數移到類外面)
注釋掉obj1和obj2的實例化代碼
class Program
{
static void Main(string[] args)
{
//StaticConstructorTest obj1 = new StaticConstructorTest();
//StaticConstructorTest obj2 = new StaticConstructorTest();
Console.WriteLine(StaticConstructorTest.Count);
Console.ReadKey();
}
}