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

C# 單例模式五大實現對比:從基礎版到執行緒安全、泛型、雙重檢查、靜態建構函式最佳實踐

     編輯:關於C#

單例模式確保類別僅有一實例並提供全域存取點。C#/.NET 提供多種實現路徑,各有權衡。

版本一:基本版(非執行緒安全)


public class Singleton {
    private static Singleton _instance;
    private Singleton() {}
    public static Singleton Instance {
        get {
            if (_instance == null) _instance = new Singleton();
            return _instance;
        }
    }
}

❌ 多執行緒下可能建立多實例

版本二:靜態唯讀欄位(CLR 保證執行緒安全、延遲初始化)⭐ 推薦預設


public sealed class Singleton {
    private static readonly Singleton _instance = new();
    private Singleton() {}
    public static Singleton Instance => _instance;
}
  • CLR 靜態建構函式語義:僅執行一次、執行緒安全、延遲至首次存取
  • 零鎖定、零判斷、程式碼最少、效能最佳
  • sealed 防繼承破壞單例語義

版本三:泛型單例提供者(進階復用)


public class SingletonProvider where T : new() {
    private SingletonProvider() {}
    public static T Instance => SingletonCreator.Instance;
    private class SingletonCreator {
        static SingletonCreator() {}
        internal static readonly T Instance = new T();
    }
}
// 使用:SingletonProvider.Instance
  • 巢狀泛型類別延遲初始化,每個 T 獨立單例
  • 適用於插件架構、多租戶服務工廠

版本四:雙重檢查鎖定(手動控制、跨語言模式)


public sealed class Singleton {
    private static volatile Singleton _instance;
    private static readonly object _sync = new();
    private Singleton() {}
    public static Singleton Instance {
        get {
            if (_instance == null) {
                lock (_sync) {
                    if (_instance == null) _instance = new Singleton();
                }
            }
            return _instance;
        }
    }
}
  • volatile 防指令重排
  • lock(_sync) 專用同步物件(非 this)
  • ⚠️ 僅 .NET 記憶體模型保證有效,C++/Java 舊版需額外原子操作
  • 現代 .NET 不推薦:版本二更簡潔正確

版本五:Lazy<T> 封裝(.NET 4.0+ 標準化)


public sealed class Singleton {
    private static readonly Lazy _lazy = new(() => new Singleton());
    private Singleton() {}
    public static Singleton Instance => _lazy.Value;
}
  • LazyThreadSafetyMode.ExecutionAndPublication(預設)全執行緒安全
  • 支援例外快取、自定義執行緒安全模式
  • 語義明確、可測試、可序列化

選型決策表

場景推薦版本理由
一般單例版本二 (static readonly)最簡、最快、CLR 原生保證
需參數化建構/條件建立版本五Lazy 支援工廠委派、例外處理
多型別單例工廠版本三泛型復用、獨立生命週期
教學/跨語言對比版本四展示記憶體模型細節

單例非銀彈:優先考慮依賴注入 (DI) 管理單例生命週期(services.AddSingleton<IService, Service>()),避免全域狀態耦合、難測試、難替換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved