首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++/CLI 靜態建構子實作:跨執行期保持唯一 ID 的交易追蹤範例

     編輯:VC 教學

情境:交易唯一 ID 需跨程式執行持久化

每筆交易需唯一遞增 ID,程式結束時保存下一可用 ID,下次啟動恢復。標準 C++ 無內建機制,CLI 基礎庫也無,需使用 .NET 延伸 IO(File, StreamReader/Writer)實作。

靜態建構子語法


ref class Transaction {
    static int nextId;
    int id;
    static bool traceEnabled;

    // 靜態建構子:型別首次使用前自動執行一次
    static Transaction() {
        // 從檔案讀取 nextId,檔案不存在預設 0
        StreamReader^ sr = File::OpenText("txn.id");
        nextId = Int32::Parse(sr->ReadLine());
        sr->Close();
    }

    // 實例建構子
    Transaction() {
        id = nextId++;
    }

    ~Transaction() { } // 解構子(非決定性)

    // 靜態屬性控制 ToString 是否顯示 ID
    static property bool TraceID { bool get() { return traceEnabled; } void set(bool v) { traceEnabled = v; } }

    virtual String^ ToString() override {
        return traceEnabled ? String::Format("[{0}]{1}", id, ...) : ...;
    }
};

執行示範


Transaction::TraceID = true;
Transaction^ t1 = gcnew Transaction; // [0]
Transaction^ t2 = gcnew Transaction; // [1]
// 程式結束時靜態解構子或手動儲存 nextId

關鍵特性

  • 執行時機:型別首次被存取(建立實例、呼叫靜態方法、存取靜態欄位)前保證執行一次。
  • 執行緒安全:CLR 保證靜態建構子在多執行緒環境下只執行一次。
  • 無參數:不能帶參數,也不能被直接呼叫。
  • 配合靜態解構子:static ~Transaction() 在應用程式域卸載時執行,適合寫回持久化檔案。

完整持久化模式


static Transaction() {
    try {
        StreamReader^ sr = File::OpenText("txn.id");
        nextId = Int32::Parse(sr->ReadLine());
        sr->Close();
    } catch (FileNotFoundException^) { nextId = 0; }
}

static ~Transaction() {
    StreamWriter^ sw = File::CreateText("txn.id");
    sw->WriteLine(nextId);
    sw->Close();
}

應用場景

  • 單例模式初始化(Singleton::Instance 屬性 getter 內觸發)。
  • 效能計數器、登錄機碼、組態檔一次性讀取快取。
  • 原生資源(DLL Handle、資料庫連線池)進程級初始化/清理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved