常量string与静态只读string在C#
在C#中,有什么区别
static readonly string MyStr;
和
const string MyStr;
当你使用一个const
string时,编译器会在编译时embeddedstring的值。
因此,如果在不同的程序集中使用const
值,则更新原始程序集并更改该值,否则在重新编译之前,其他程序集将看不到更改。
static readonly
string是在运行时查找的普通字段。 因此,如果该字段的值在不同的程序集中发生更改,程序集加载后即可看到更改,无需重新编译。
这也意味着static readonly
string可以使用非常量成员,如Environment.UserName
或DateTime.Now.ToString()
。 const
string只能使用其他常量或文字进行初始化。
而且, static readonly
string可以在静态构造函数中设置; 一个const
string只能被内联初始化。
请注意,可以修改static string
; 你应该使用static readonly
。
这是一个很好的细分利弊 :
所以,当值不可能发生改变时,或者如果没有外部应用程序/库将使用常量,应该使用常量。 当需要运行时计算,或者如果外部消费者是一个因素,应该使用静态只读字段。
OQ询问static string
与const
。 两者都有不同的用例(尽pipe两者都被视为静态)。
使用常量只有真正的恒定值(例如光速 – 但即使这取决于媒体)。 这个严格的准则的原因是,const值被replace成引用它的程序集中的const的用法,这意味着如果const在定义的位置发生变化(即它不应该是一个常量毕竟)。 请注意,这甚至会影响private const
字段,因为您可能在不同的程序集中有基类和子类,并且私有字段会被inheritance 。
静态字段与它们在其中声明的types绑定。 它们用于表示给定types的所有实例需要相同的值。 这些字段可以根据需要多次写入(除非指定只读)。
如果你的意思是static readonly
和const
,那么我build议static readonly
几乎所有的情况下,因为它是更有前途的证据。
快速回答 :
public const string MyStr;
是编译时间常量(例如,您可以将其用作方法参数的默认参数),如果您使用这种技术,则不会被模糊处理
public static readonly string MyStr;
是运行时常量,这意味着它在应用程序启动时而不是之前被评估。 这就是为什么它不能用作方法(编译错误)的默认参数。 存储在其中的值可能会被混淆
您只能在类的static
构造函数或variables初始值设定项中更改static readonly string
的值,而不能在任何地方更改const
string的值。