2017-08-31 53 views
-4

我部分修改應用程序,我將需要以下常量的值設置爲可變如果存在環境的價值。在C#中設定值恆定的特性

我已經有了:

private const string BuildPackagePath = @"\\server\build\"; 

我想要做的是:

if (Environment.GetEnvironmentVariable("EnvVar") != null) 
Set the property value to = Environment.GetEnvironmentVariable("EnvVar") 
else 
{Keep default/assigned value} 

我明白,一個asignment的左邊必須是一個變量。我可能不得不改變類型,但只是想知道是否有人能給我一個想法,所以當前代碼的結構可以保持原樣。

+3

您不能修改常量值,這就是爲什麼它被稱爲* constant *。但是,您可以使用'readonly'來表示只能在構造函數中修改成員。 – HimBromBeere

+0

謝謝!我只是想檢查 – ditu

+0

對於大多數打算和目的'靜態readonly'會像'const' *運行時*。如果你需要一個編譯時間常數,你當然不能使用它。 - 所以你可以有'私人靜態只讀字符串BuildPackagePath = Environment.GetEnvironmentVariable(「ENVVAR」)? @「\\服務器\建設\」;' – Corak

回答

2

考慮使用靜態屬性,而不二傳手

// evaluates Environment Variable on each call 
private static string BuildPackagePath 
{ 
    get { return Environment.GetEnvironmentVariable("EnvVar") ?? @"\server\build\"; } 
} 

靜態只讀域將(在啓動時,但不會立即When do static variables get initialized in C#?)評價環境變量只有一次

private static readonly string BuildPackagePath = 
     Environment.GetEnvironmentVariable("EnvVar") ?? @"\server\build\"; 
+2

記住,這是評估每次吸氣調用時...如果在運行過​​程中ENVVAR設置,其結果可能會改變。 – Fildor

+0

@Fildor,是的。它可能是需要的,或者不是。如果不是,那麼靜態只讀字段而不是屬性應該工作,因爲它被初始化一次。 readonly實例字段將重新評估每個新對象的EnvironmentVariable。很多選擇,根據要求選擇 – ASh

+0

我同意,它*可能*是理想的。我只是想指出這種行爲,以避免「驚喜」。 – Fildor

1

您不容修改常量的值,that's爲什麼it's稱爲不變。但是你可以用readonly,表明成員只能在構造函數中進行修改:

class MyClass 
{ 
    private readonly string BuildPackagePath; 
    public MyClass() 
    { 
     var value = Environment.GetEnvironmentVariable("EnvVar"); 
     if(value != null) this.BuildPackagePath = value; 
     else this.BuildPackagePath = @"\server\build\"; 
    } 
} 

甚至更​​短的使用null-conitional operation

this.BuildPackagePath = value ?? @"\server\build\"; 
1

您可以使用「只讀」修飾符而不是const。然後你可以在一個類的構造函數中設置該字段的值。例如:

class SampleClass 
{ 
     public int x; 
     // Initialize a readonly field 
     public readonly int y = 25; 
     public readonly int z; 

     public SampleClass() 
     { 
     // Initialize a readonly instance field 
     z = 24; 
     } 
}