在C#中,
之间有什么区别static readonly string MyStr;
和
const string MyStr;
答案 0 :(得分:142)
当您使用const
字符串时,编译器会在编译时嵌入字符串的值 。
因此,如果在不同的程序集中使用const
值,然后更新原始程序集并更改值,则在重新编译之前,其他程序集将不会看到更改。
static readonly
字符串是在运行时查找的普通字段。因此,如果在不同的程序集中更改了字段的值,则只要加载程序集就会看到更改,而不重新编译。
这也意味着static readonly
字符串可以使用非常量成员,例如Environment.UserName
或DateTime.Now.ToString()
。 const
字符串只能使用其他常量或文字进行初始化
此外,可以在静态构造函数中设置static readonly
字符串; const
字符串只能内联初始化。
请注意,static string
可以修改;你应该使用static readonly
代替。
答案 1 :(得分:35)
以下是a good breakdown of the pros and cons:
因此,当值不太可能发生变化,或者没有外部应用程序/库将使用常量时,似乎应该使用常量。当需要运行时计算时,或者如果外部消费者是一个因素,则应使用静态只读字段。
答案 2 :(得分:10)
快速回答:
public const string MyStr;
是编译时常量(例如,您可以将其用作方法参数的默认参数),如果您使用此类技术,则不会对其进行模糊处理
public static readonly string MyStr;
是运行时常量,这意味着它在应用程序启动时而不是之前进行评估。这就是为什么它不能用作方法(编译错误)的默认参数。存储在其中的值可以进行模糊处理
答案 3 :(得分:5)
OQ询问了static string
vs const
。两者都有不同的用例(尽管两者都被视为静态)。
仅将const用于真正恒定的值(例如光速 - 但即使这取决于介质也是如此)。这个严格准则的原因是const值被替换为引用它的程序集中const的使用,这意味着如果const在其定义位置发生变化(即它不应该是一个常量),你可以有版本问题。毕竟)。请注意,这甚至会影响private const
字段,因为您可能在不同的程序集和private fields are inherited中有基类和子类。
静态字段与它们在其中声明的类型相关联。它们用于表示对于给定类型的所有实例需要相同的值。这些字段可以根据需要写入多次(除非指定只读)。
如果您的意思是static readonly
vs const
,那么几乎所有情况都会推荐static readonly
,因为它更适合未来。
答案 4 :(得分:2)
当您使用const字符串时,编译器会在编译时嵌入该字符串的值。 因此,如果您在其他程序集中使用const值,然后更新原始程序集并更改该值,则另一个程序集将不会看到更改,直到您重新编译它为止。
静态只读字符串是在运行时查找的普通字段。因此,如果在不同的程序集中更改了字段的值,则在程序集加载后就可以看到更改,而无需重新编译。
答案 5 :(得分:0)
您只能在类的static readonly string
构造函数或变量初始值设定项中更改static
的值,而不能在任何位置更改const
字符串的值。