靜態建構函式在類別首次使用前自動執行,適合初始化靜態資源(如從檔案載入狀態)。本文以 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。
static initonly array<double>^ coefficients;:僅能在靜態建構函式初始化,之後視為唯讀。適合載入工程常數表。搭配索引屬性 property double Coeff[int] 提供安全存取。
首次執行 ID 0~3,第二次執行續號 6~9(中間 4、5 為函數傳值參數產生的暫時物件消耗),證明機制跨進程有效。