2017-08-31 8 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

定数値を変更することはできません。そのため、定数*と呼ばれます。しかし、 'readonly'を使って、メンバーがコンストラクタ内でのみ変更できることを示すことができます。 – HimBromBeere

+0

ありがとうございます!私はちょうど確認したかった – ditu

+0

'static readonly'は実行時に' const' *のように動作します。コンパイル時定数が必要な場合は、もちろん使用できません。 - あなたは 'private static readonly string BuildPackagePath = Environment.GetEnvironmentVariable(" EnvVar ")を持つことができますか? @ "\\ server \ build \"; ' – Corak

答えて

2

セッターせずに静的プロパティを使用することを検討して

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

static readonlyフィールドは、環境変数を1回だけ評価します(ただし、起動時にすぐにはなりません)When do static variables get initialized in C#?

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

ゲッターが呼び出されるたびに評価されることを覚えておいてください。実行時にEnvVarが設定されていると結果が変わる可能性があります。 – Fildor

+0

@Fildor、はい。それが望ましいかもしれないし、そうでないかもしれない。もしそうでなければ、プロパティの代わりに 'static readonly'フィールドが一度初期化されるので動作します。 'readonly'インスタンスフィールドは、新しいオブジェクトごとにEnvironmentVariableを再評価します。多くのオプションは、要求に応じて選択してください – ASh

+0

私はそれに同意することができます*ことができます。私はちょうど "驚き"を避けるためにその行動を指摘したかった。 – Fildor

1

という定数がと呼ばれているため、定数値を変更できません。しかし、あなたはメンバーのみが、コンストラクタ内で変更可能であることを示すために、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の代わりに "readonly"修飾子を使用できます。次に、クラスのコンストラクタでフィールドの値を設定できます。例:

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; 
     } 
} 
関連する問題