如何声明只能在运行时初始化的const

时间:2012-06-15 16:20:42

标签: c#

我的班级包含LOT_SIZE常量,无法更改。但我只能在执行期间初始化它,因为我在运行时从证券表中获取LOT_SIZE。但是我想明确指出这是不变的,我希望保护它免受来自任何其他地方的更改,除了我想要初始化它的一个“朋友”地点(“证券”表格读取)。

我们在C#中有什么东西可以使用LOT_SIZE作为常规变量吗?

我无法将LOT_SIZE声明为readonly,因为在对象构建期间,“证券”表仍未读取,因此我不知道LOT_SIZE值。

3 个答案:

答案 0 :(得分:4)

最好的方法是在创建必须保存它的类之前读取值,这样就可以将它传递给构造函数并将其放入readonly字段。但是,你已经排除了明显的做法......

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

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

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

答案 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>();
}

答案 2 :(得分:0)

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