类级字符串常量vs方法级字符串常量
本文关键字:常量 字符串 方法 vs | 更新日期: 2023-09-27 18:02:41
类级字符串常量和方法级字符串常量之间有什么显著的区别吗?编译器会识别常量并应用常量折叠吗?还是总是会创建一个新对象?
下面是一个例子:
class A
{
private const string Sid = "sid";
private const string Pid = "pid";
public void Do()
{
Console.WriteLine(Sid);
Console.WriteLine(Pid);
}
}
方法级常量:
class B
{
public void Do()
{
const string Sid = "sid";
const string Pid = "pid";
Console.WriteLine(Sid);
Console.WriteLine(Pid);
}
}
字符串常量是较新的"内联"*,因为它们是真对象。编译器总是将同一字符串常量的部分合并在一起。"a"+"b"等同于指定"ab")。
字符串常量也可以"内化"——意思是相同值的所有常量都引用相同的实际字符串对象(据我所知c#编译器总是这样做)。
数字常量除了在编译时总是尽可能地计算外,还可以"内联"到使用它们的地方(即2*2*4与指定16相同)。
要实现"共享常数"行为,需要使用readonly
字段而不是const
。
*"inline"直接放到结果代码中,而不是引用共享值。
常量之间的区别在于作用域——就像非const声明一样,要考虑的主要问题是可以从哪里访问这些值。现在,哪个声明更干净是无关紧要的,足以值得一场史诗级的火焰大战…