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

时间:2010-07-06 23:11:01

标签: c#

在C#中,

之间有什么区别
static readonly string MyStr;

const string MyStr;

6 个答案:

答案 0 :(得分:142)

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

static readonly字符串是在运行时查找的普通字段。因此,如果在不同的程序集中更改了字段的值,则只要加载程序集就会看到更改,而不重新编译。

这也意味着static readonly字符串可以使用非常量成员,例如Environment.UserNameDateTime.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字符串的值。