4

私のクラスにはLOT_SIZE、変更できない定数が含まれています。LOT_SIZEただし、実行時にSecuritiesテーブルから取得するため、実行中にのみ初期化できます。ただし、これは一定であることを明確にし、初期化する1つの「友人」の場所(「セキュリティ」テーブルの読み取り)を除く他の場所からの変更から保護したいと思います。

C#でそのための何かがありますか、LOT_SIZEそれとも通常の変数として使用する必要がありますか?

LOT_SIZEオブジェクトの構築中に「セキュリティ」テーブルがまだ読み取られreadonlyないため、値がわからないため、宣言できませんLOT_SIZE

4

3 に答える 3

4

おそらく最良の方法は、値を保持する必要のあるクラスを作成する前に値を読み取ることです。これにより、値をコンストラクターに渡してフィールドに入れることができreadonlyます。しかし、あなたがそれを明白な方法で行うことを除外したので...

読み取り専用プロパティ(getはあるが設定がないプロパティ)を使用して、最初に値を設定した場所を除いて、常にプロパティを介してアクセスできます。

自分のクラス内から変更するリスクを冒したくない場合は、値を「ラップ」するクラスを作成します。このクラスは、最初に必要になったときに値を読み取り、それを読み取り専用プロパティとしてコンシューマークラスに公開するだけです。

ただし、どちらの方法を選択する場合でも、定数に「1970年代のCマクロ定数」(ALL_CAPS)の名前を使用しないでください:-)

于 2012-06-15T16:35:39.763 に答える
1

ある場所で変更でき、他の場所では変更できないような方法で変数を宣言することはできません(除外した読み取り専用を除く)。

ある種の「怠惰なパターン」を使用することをお勧めします。値をラップし、値を1回だけ設定できるクラスを作成します。このクラスのインスタンスを参照する変数を読み取り専用にすることができます。

class WriteOnce<T>
{
 T _val;
 bool _isInitialized;

 public T Value {
  get { if (!_isInitialized) throw; return _val; }
  set { if (_isInitialized) throw; _val = value; }
 }
}

...

class SomeOtherClass {
 readonly WriteOnce<int> LOT_SIZE = new WriteOnce<int>();
}
于 2012-06-15T16:23:31.487 に答える
0

プライベートメンバー変数を使用してテーブルから読み取るクラスを作成できます(クラスをシングルトンにして、非常に凝ったものにすることもできます)。次に、ゲッターのみを使用して静的パブリック変数を作成します。少しやり過ぎですが、初期化後に設定できるようにする唯一の方法ですが、変更できるのは1回だけです。

于 2012-06-15T16:25:10.357 に答える