类级别字符串常量与方法级别字符串常量之间是否存在任何显着差异。编译器会识别常量并应用常量折叠吗?或者总是会创建nw对象吗?
以下是示例:class-level consts
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);
}
}
答案 0 :(得分:1)
常量之间的差异在于范围 - 正如非const声明一样,要考虑的主要事项是可以访问这些值的位置。现在,哪个宣言更加清晰,无足轻重,值得一场史诗般的火焰战......
答案 1 :(得分:0)
字符串常量是较新的“内联”*因为它们是真正的对象。编译器将始终合并添加在一起的相同字符串常量的部分(即“a”+“b”与指定“ab”相同)。
字符串常量也可以“实现” - 意味着相同值的所有常量都引用相同的实际字符串对象(据我所知,C#编译器总是这样做。)
除了在编译时总是尽可能多地计算数字常数之外,数字常量可以“内联”到使用它们的地方(即2 * 2 * 4与指定16相同)。
要实现“共享常量”行为,需要使用readonly
字段而不是const
。
*“inline”直接放入生成的代码中,而不是引用共享值。