C# 如何声明只能在运行时初始化的常量

C# 如何声明只能在运行时初始化的常量,c#,C#,我的类包含无法更改的LOT\u SIZE常量。但我只能在执行期间初始化它,因为我在运行时从Securities表中获取LOT\u SIZE。然而,我想说明的是,这是一个常量,我想保护它不受任何其他地方的更改,除了一个我想初始化它的“朋友”地方(“证券”表读取) 我们在C#中是否有这样的东西,或者我只需要使用LOT_SIZE作为正则变量 我不能将LOT\u SIZE声明为readonly,因为在对象构造期间,“Securities”表仍然没有读取,因此我不知道LOT\u SIZE值。您不能以一种方

我的类包含无法更改的
LOT\u SIZE
常量。但我只能在执行期间初始化它,因为我在运行时从Securities表中获取
LOT\u SIZE
。然而,我想说明的是,这是一个常量,我想保护它不受任何其他地方的更改,除了一个我想初始化它的“朋友”地方(“证券”表读取)

我们在C#中是否有这样的东西,或者我只需要使用
LOT_SIZE
作为正则变量


我不能将
LOT\u SIZE
声明为
readonly
,因为在对象构造期间,“Securities”表仍然没有读取,因此我不知道
LOT\u SIZE
值。

您不能以一种方式声明变量,即它可以在一个位置修改,而不能在任何其他位置修改(您排除的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>();
}
类写入
{
T_val;
布尔值被初始化;
公共价值{
获取{if(!\isInitialized)抛出;返回{u val;}
设置{if(_isInitialized)throw;_val=value;}
}
}
...
给别人上课{
readonly WriteOnce LOT_SIZE=新WriteOnce();
}

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

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

您可以使用只读属性(带有get但没有set的属性),并始终通过该属性访问该属性,初始设置值的位置除外

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


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

-初始化类之前,您不能阅读证券表吗?您可以在类中转换一个常规的私有变量,然后只给变量一个属性get访问器
LOT\u SIZE
是否可以成为“friend”place的只读成员?如果这是负责值的类,也许它应该存在于那里。@jrummell可能但不是微不足道的,但是可以使用
mafue
建议的方法。@Steve仍然不清楚这实际上是constanti使用的CAPS,因为这是Java中的默认代码样式,仅创建于1995年:)