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

C++/CLI 靜態建構函式實戰:跨執行期保持物件 ID 唯一性

     編輯:關於C++

靜態建構函式在類別首次使用前自動執行,適合初始化靜態資源(如從檔案載入狀態)。本文以 Point 類別為例,示範跨程式執行保持 ID 唯一遞增。

問題情境

每個 Point 實例需唯一 ID。程式結束時將下一可用 ID 寫入檔案,下次啟動讀取繼續分配,避免重複。標準 C++ 無標準機制達成,CLI 擴展庫提供支援。

靜態建構函式語法

public ref class Point {
    static int nextAvailableID;
    static String^ masterFileLocation;

    static Point() { // 靜態建構函式
        AppDomain^ dom = AppDomain::CurrentDomain;
        masterFileLocation = String::Concat(dom->BaseDirectory, "\\PointID.txt");
        try {
            StreamReader^ sr = File::OpenText(masterFileLocation);
            nextAvailableID = Int32::Parse(sr->ReadLine());
            sr->Close();
            dom->ProcessExit += gcnew EventHandler(&Point::ProcessExitHandler);
        } catch (FileNotFoundException^) {
            // 首次執行,檔案不存在,nextAvailableID 保持 0
        } finally {
            dom = nullptr;
        }
    }

    static void ProcessExitHandler(Object^, EventArgs^) {
        StreamWriter^ sw = File::CreateText(masterFileLocation);
        sw->WriteLine(nextAvailableID);
        sw->Close();
    }
    // ...
};

關鍵機制解析

  • 觸發時機:首次存取靜態成員(欄位/屬性/方法)前執行,一次保證。
  • 限制:無參數、無存取修飾詞(編譯器忽略)、不可繼承、不可直接呼叫。
  • finally 區塊:C++/CLI 擴展 try/catch/finally,確保資源釋放(此例釋放 AppDomain 控制代碼)。
  • 事件處理:AppDomain::ProcessExit 事件註冊靜態處理函式,程式正常結束前執行寫入。
  • 委派:gcnew EventHandler(&Point::ProcessExitHandler) 包裝靜態方法。

實例建構函式配合

int ID;
Point() { ID = GetNextID(); X = 0; Y = 0; }
Point(int x, int y) { ID = GetNextID(); X = x; Y = y; }
Point(Point% p) { ID = GetNextID(); X = p.X; Y = p.Y; } // 複製建構函式

static int GetNextID() { return nextAvailableID++; }

所有建構函式(含複製)均呼叫 GetNextID 取得唯一值;指派運算子不改變 ID。

initonly 欄位

static initonly array<double>^ coefficients;:僅能在靜態建構函式初始化,之後視為唯讀。適合載入工程常數表。搭配索引屬性 property double Coeff[int] 提供安全存取。

執行結果驗證

首次執行 ID 0~3,第二次執行續號 6~9(中間 4、5 為函數傳值參數產生的暫時物件消耗),證明機制跨進程有效。

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