2016-09-30 11 views
1

私はクラス内で一度設定したいクラスに含まれるメソッドであっても変更できないデータベース文字列を持っています。試しましたクラス内の値を非const値に設定して変更不可にする

private const string ExampleConString = ConfigurationManager.ConnectionStrings["Example"].ConnectionString; 

しかし、constを非const値に設定しようとしてエラーが発生しました。

私が思いつくことができる唯一の解決策は、ラッパークラスを作成して元のクラス内でインスタンス化することでしたが、それは他の人が読んで、おそらくリソースを集中させるのが混乱しているようです。

public class ConnectionStringEncapsulator 
{ 
    private string connectionString = ConfigurationManager.ConnectionStrings["Example"].ConnectionString; //global connection string 
    public string connectionString { get; } 
} 

public class TradeDB 
{ 
    private ConnectionStringEncapsulator TradeDBconnectionString; 
    public TradeDB() 
    { 
     TradeDBconnectionString = new ConnectionStringEncapsulator(); 
    } 
} 
+1

たぶん読み取り専用フィールド(それが正確に正しくない可能性がありますので、これはメモリからですか)? – YuvShap

答えて

5

readonlyと宣言してください。フィールド初期化子またはクラスコンストラクターでのみ設定できます。

private readonly string TradeDBconnectionString; 

staticと組み合わせた場合、フィールドは、代わりに、インスタンスコンストラクタの静的コンストラクタに設定されなければなりません。両方の用途に適しています。

private static readonly string ExampleConString = ConfigurationManager.ConnectionStrings["Example"].ConnectionString; 

あなたがconstreadonlyon MSDNの違いについての詳細を読むことができます:あなたが欲しい

+3

'const'と互換性があるためには' static readonly'として宣言する必要があります。 – Abion47

+0

@ Abion47コンパイルされたコードへの影響に関しては、呼び出される方法とその値が設定される頻度でのみ、互換性がありません。 –

+0

@DavidLだからこそ、私は「同一」ではなく「交換可能」と言いました。 – Abion47

-1
private readonly string connectionString = ConfigurationManager.ConnectionStrings["Example"].ConnectionString; 
2

readonlyキーワードです。

つまり、constの変数は、コンパイル時に定義された値で宣言されたときにのみ初期化できます。readonly変数は、コンストラクタ内および実行時定義の値で初期化できます。また、const変数は暗黙的にstaticですが、readonlyは明示的に宣言されていない場合はインスタンスに依存しますstatic

0

おそらくLazyクラスを使用しています。

public class myclass 
{ 
    private readonly Lazy<string> ExampleConString = 
    new Lazy<string>(() => 
     ConfigurationManager.ConnectionStrings["Example"].ConnectionString, 
     LazyThreadSafetyMode.ExecutionAndPublication); 
} 
関連する問題