static 表示「屬於型別本身,不屬於特定實例」。對應的預設行為常被稱為 auto(實例成員),其生命週期隨物件建立/銷毀。static 成員在型別初始化時分配,程式結束前釋放,全域共享單一副本。
class Config {
public static string ConnectionString { get; set; } // 全域共享
private static int _instanceCount;
public static int InstanceCount => _instanceCount;
}
null/0/false)。Config.ConnectionString(透過類別名,非實例)。Interlocked。
class MathUtil {
public static double Square(double x) => x * x; // 無 this,不可存取實例成員
}
sealed,不可 virtual/override(但可 new 隱藏)。
class Logger {
static Logger() { // 僅執行一次,型別首次使用前
_logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
Directory.CreateDirectory(_logPath);
}
private static string _logPath;
public static void Log(string msg) { /* ... */ }
}
TypeInitializationException。純 C# 中較少見,但理解有助於互操作:
static 修飾命名空間層級變數/函式 → 內部連結,僅在該編譯單元(.cs 檔)可見。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
}
// 雙重檢查鎖定單例
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;
}
}
}
staticstatic 可變集合(List、Dictionary)直接暴露,封裝存取並加鎖。