首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# static 關鍵字全方位深度解析:靜態成員、建構函式、全域變數與執行期行為

     編輯:關於C#

核心概念:static vs auto(實例)

static 表示「屬於型別本身,不屬於特定實例」。對應的預設行為常被稱為 auto(實例成員),其生命週期隨物件建立/銷毀。static 成員在型別初始化時分配,程式結束前釋放,全域共享單一副本。

四大使用場景

1. 類別靜態欄位與屬性


class Config {
    public static string ConnectionString { get; set; } // 全域共享
    private static int _instanceCount;
    public static int InstanceCount => _instanceCount;
}
  • 必須在類別外部(或靜態建構函式)初始化,否則為預設值(null/0/false)。
  • 存取方式:Config.ConnectionString(透過類別名,非實例)。
  • 執行緒安全:多執行緒讀寫需自行加鎖或用 Interlocked。

2. 類別靜態方法


class MathUtil {
    public static double Square(double x) => x * x; // 無 this,不可存取實例成員
}
  • 隱含 sealed,不可 virtual/override(但可 new 隱藏)。
  • 常用於工廠方法、輔助運算、單例模式存取點。

3. 靜態建構函式


class Logger {
    static Logger() { // 僅執行一次,型別首次使用前
        _logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
        Directory.CreateDirectory(_logPath);
    }
    private static string _logPath;
    public static void Log(string msg) { /* ... */ }
}
  • 無參數、無存取修飾詞、每個類別僅一個。
  • 執行時機:型別首次被主動使用前(建立實例、呼叫靜態成員、反射等),由 CLR 保證執行緒安全、僅執行一次。
  • 異常處理:若拋出異常,型別標記為不可用,後續存取擋 TypeInitializationException。

4. 檔案級/組件級靜態變數與函式(C++/CLI 或 unsafe 語境)

純 C# 中較少見,但理解有助於互操作:

  • static 修飾命名空間層級變數/函式 → 內部連結,僅在該編譯單元(.cs 檔)可見。
  • 對應 C++ static 全域變數/函式語意。

進階主題

靜態類別


static class Extensions {
    public static string ToJson(this object obj) => JsonSerializer.Serialize(obj);
}
  • 隱含 abstract sealed:不可實例化、不可繼承、僅能包含靜態成員。
  • 擴充方法必須定義於靜態類別。

靜態與泛型


class Repository {
    public static int Count { get; private set; } // 每個封閉構造型別獨立一份:Repository.Count ≠ Repository.Count
}

效能與記憶體

  • 靜態欄位駐留在高頻堆,不受 GC 代數遷移影響,存取極快。
  • 過度使用靜態狀態導致隱性耦合、難以測試、記憶體洩漏(靜態集合持有參考)。

執行緒安全模式


// 雙重檢查鎖定單例
public sealed class Singleton {
    private static volatile Singleton _instance;
    private static readonly object _lock = new object();
    private Singleton() { }
    public static Singleton Instance {
        get {
            if (_instance == null) {
                lock (_lock) {
                    if (_instance == null) _instance = new Singleton();
                }
            }
            return _instance;
        }
    }
}

最佳實踐清單

  • ✅ 工具方法、常數、快取、單例、擴充方法 → static
  • ✅ 狀態隨實例變化、需多實例共存、需單元測試隔離 → 實例成員
  • ⚠️ 避免 static 可變集合(List、Dictionary)直接暴露,封裝存取並加鎖。
  • ⚠️ 靜態建構函式中避免耗時 I/O、死鎖風險、呼叫虛擬方法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved