C#靜態構造函數調用機制


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();
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM