const字符串与c#中的静态只读字符串


const string vs. static readonly string in c#

在C中,两者之间的区别是什么?

1
static readonly string MyStr;

1
const string MyStr;


当使用const字符串时,编译器在编译时嵌入该字符串的值。因此,如果在其他程序集中使用const值,然后更新原始程序集并更改该值,则在重新编译之前,其他程序集将看不到更改。

static readonly字符串是在运行时查找的正常字段。因此,如果字段的值在不同的程序集中发生更改,则在加载程序集时将立即看到这些更改,而无需重新编译。

这也意味着static readonly字符串可以使用非常量成员,如Environment.UserNameDateTime.Now.ToString()const字符串只能使用其他常量或文本初始化。另外,可以在静态构造函数中设置static readonly字符串;只能在内联中初始化const字符串。

注意,可以修改static string;您应该改为使用static readonly


下面是一个很好的利弊分析:

So, it appears that constants should be used when it is very unlikely that the value will ever change, or if no external apps/libs will be using the constant. Static readonly fields should be used when run-time calculation is required, or if external consumers are a factor.


快速回答:

1
public const string MyStr;

是编译时常量(例如,可以将其用作方法参数的默认参数),如果使用这种技术,则不会混淆它。

1
public static readonly string MyStr;

是运行时常量,这意味着它是在启动应用程序时计算的,而不是在启动应用程序之前。这就是为什么它不能用作方法(编译错误)的默认参数的原因。存储在其中的值可能被混淆


OQ询问了static stringconst的情况。两者都有不同的用例(尽管两者都是静态的)。

仅对真正恒定的值使用const(例如光速-但这取决于介质)。这个严格准则的原因是,const值被替换为引用它的程序集中const的用法,这意味着如果const在其定义位置发生更改(即,它根本不应该是常量),就可能存在版本控制问题。注意,这甚至会影响private const字段,因为您可能在不同的程序集中拥有基和子类,而私有字段是继承的。

静态字段绑定到它们声明的类型。它们用于表示给定类型的所有实例都需要相同的值。这些字段可以写入任意次数(除非指定为只读)。

如果你是说static readonlyconst,那么我建议在几乎所有情况下使用static readonly,因为它更能证明未来。


只能在类或变量初始值设定项的static构造函数中更改static readonly string的值,而不能在任何地方更改const字符串的值。