[英]Regarding C# Static Readonly members
我有以下情況。 我的應用程序中有一些非常常見的類,它包含一個名為“BinDirectory”的靜態只讀字段,它保存bin目錄的路徑。 此類中的其他字段(也是靜態只讀)也使用此值作為其值的基礎。 在當前版本上,BinDirectory被初始化為保存代碼運行的目錄(即Assembly.GetExecutingAssembly()。CodeBase)。 我想擴展此類以初始化BinDirectory,以便在從我的應用程序安裝程序運行時從安裝程序上下文中保存“TargetDir”。 我可以將BinDirectory改為靜態但我不想,因為它會讓我對我的應用程序中常見的類進行大量更改。 有人可以為這個問題提出一個優雅的解決方案嗎?
使用“get”訪問器使其成為一個屬性:
public static string BinDirectory
{
get { return _initialisedBinDirectory; }
}
然后在靜態構造函數代碼中,根據需要初始化私有變量。
編輯
延遲加載(根據評論):
public static string BinDirectory
{
get
{
if (_initialisedBinDirectory == null)
// load the variable when needed
else
return _initialisedBinDirectory;
}
}
這樣您只需在需要時加載變量,並且只要再次調用它就會重新使用它。 希望你不要將null
作為它的有效值。
這就是AppConfigs的用途。 在AppSettings部分中,添加一個名為BinDirectory
的新密鑰。 你可以重新編寫你的課程:
public static string BinDirectory
{
get
{
return ConfigurationManager.AppSettings["BinDirectory"];
}
}
最后,作為安裝過程的最后一步,您可以將BinDirectory更改為指向所需的任何目錄。 所以現在這個值完全由安裝程序上下文決定。
聽起來你不願意將靜態只讀字段更改為靜態,因為它會強制您更改類中所有其他靜態只讀字段的初始化。
如果這是正確的,不幸的是,你可以做很多事情,但要花時間做出改變。 通過允許在運行時設置BinDirectory字段,您將從根本上改變字段的初始化順序。 您的代碼需要適應。
我認為最簡單的方法是轉換為使用靜態只讀屬性,這些屬性可以動態計算值。
例如:
public class Values {
public static string BinDir;
public static string OtherDir {
get { return Path.Combine(BinDir,@"Some\Other\Path"); }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.