4

我的课程包含LOT_SIZE无法更改的常量。但我只能在执行期间对其进行初始化,因为我LOT_SIZE是在运行时从 Securities 表中获取的。但是,我想明确表示这是不变的,并且我想保护它免受任何其他地方的更改,除了我要初始化它的一个“朋友”地方(“证券”表读取)。

我们在 C# 中有什么东西,或者我只需要LOT_SIZE用作常规变量吗?

我不能声明LOT_SIZEreadonly因为在对象构造期间“证券”表仍未读取,所以我不知道LOT_SIZE价值。

4

3 回答 3

4

最好的方法可能是在创建必须保存它的类之前读取该值,因此您可以将其传递给构造函数并将其放入readonly字段中。但是,由于您排除了以明显的方式进行操作...

您可以使用只读属性(具有 get 但未设置的属性)并始终通过该属性访问它,除非在您最初设置值的位置。

如果您甚至不想冒险从自己的类中更改它,那么创建一个类来“包装”该值。此类只会在第一次需要时读取该值并将其作为只读属性公开给您的使用者类。

但无论您选择哪种方式,请不要为您的常量使用“1970 年代 C 宏常量”(ALL_CAPS)命名 :-)

于 2012-06-15T16:35:39.763 回答
1

您不能以可以在一个地方而不是在任何其他地方修改的方式声明变量(除了您排除的 readonly )。

我建议你使用某种“惰性模式”。编写一个包装一个值并允许该值被设置一次的类。您可以将引用此类实例的变量设为只读。

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

您可以使用私有成员变量创建一个从表中读取的类(甚至使该类成为 Singleton 以获得超级幻想)。然后制作一个只有 getter 的静态公共变量。这有点矫枉过正,但这是允许在初始化后设置它的唯一方法,但只能修改一次。

于 2012-06-15T16:25:10.357 回答