簡體   English   中英

關於C#Static Readonly成員

[英]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.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM