2010-04-29 49 views
2

假設我有幾個只讀變量用於文件路徑,我能否根據聲明的順序來保證賦值的順序?readonly變量聲明的順序是否保證了值的設置順序?

例如

static readonly string basepath = @"my\base\directory\location"; 
static readonly string subpath1 = Path.Combine(basepath, @"abc\def"); 
static readonly string subpath2 = Path.Combine(basepath, @"ghi\klm"; 

這是一種安全的方法或者是有可能,basepath仍可能是當時subpath1subpath2字符串的默認值使該字符串的引用?

我知道我可以通過在構造函數中賦值而不是在聲明時保證順序。但是,我相信如果我需要在靜態類中聲明變量(例如,用於控制檯應用程序的Program.cs,它具有靜態無效的Main()過程而不是構造函數),則無法實現此方法。

UPDATE:

我已經添加了static關鍵字(因爲這是我使用的是什麼,以及爲什麼它編譯),也Path.Combine的建議。

+0

爲什麼不讓它們成爲'const'?用'const'你可以肯定。 – Steven 2010-04-29 17:30:52

+0

這些路徑可能成爲程序集中其他代碼依賴的程序集的一部分。有可能這些路徑可能會改變,我希望能夠做到這一點,而不必重新編譯依賴這些路徑值的程序集的其餘部分。對於常量,我別無選擇,只能重新編譯所有內容,而不僅僅是DLL。 – 2010-04-29 17:46:18

回答

3

該命令並不重要。運行時確保所有對象在使用時都被初始化。

您的具體情況實際上並不可編譯,因爲無法保證。

你對構造方法是正確的。如果你需要這個靜態變量,這也不是問題,因爲你可以指定一個靜態構造函數。

而btw:連接目錄的正確方法是使用Path.Combine而不是字符串連接。

+0

我忘了Path.Combine方法。感謝您的提醒。 – 2010-04-29 17:42:47

+0

***在給出這個答案後,問題被更新了。***當問題字段是「靜態」時,文本順序非常重要。初始化程序按文本順序運行。所以這個答案誤導了'靜態'字段。 (靜態或非靜態是重要的;只讀或不重要。) – 2013-04-29 18:58:41

0

「是有可能。」

沒有,編譯器不會讓你從subpath1/2聲明訪問基本路徑。你可以用常量來代替只讀變量。

+0

通過說編譯器不會讓我說你的代碼不會編譯?它爲我編譯。 – 2010-04-29 17:39:32

+0

剛試過,我得到「字段初始值設定項不能引用非靜態字段,方法或屬性......」。 – heisenberg 2010-04-29 17:46:19

+0

我明白了。事實證明,在這種情況下,這些實際上是我使用的靜態只讀字符串,因此這解釋了爲什麼我得到的結果與您不同。 – 2010-04-29 17:47:28

0

我懷疑你真的想使用常量:在代碼

const string basepath = @"my\base\directory\location"; 
    const string subpath1 = basepath + @"\abc\def"; 
    const string subpath2 = basepath + @"\ghi\klm"; 

subpath1/2將絕對有填寫基本路徑前綴不論聲明順序。

+2

我總是對常量和只讀都感興趣。我讀過很多說不使用常量的東西,如果有可能改變的話。這些路徑可能成爲其他代碼依賴的程序集的一部分。我希望能夠更改這些路徑,而無需重新編譯依賴這些路徑值的其餘程序集。對於常量,我別無選擇,只能重新編譯所有內容,而不僅僅是DLL。 – 2010-04-29 17:45:06