类级字符串常量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);
        }
    }

类级字符串常量vs方法级字符串常量

字符串常量是较新的"内联"*,因为它们是真对象。编译器总是将同一字符串常量的部分合并在一起。"a"+"b"等同于指定"ab")。

字符串常量也可以"内化"——意思是相同值的所有常量都引用相同的实际字符串对象(据我所知c#编译器总是这样做)。

数字常量除了在编译时总是尽可能地计算外,还可以"内联"到使用它们的地方(即2*2*4与指定16相同)。

要实现"共享常数"行为,需要使用readonly字段而不是const

*"inline"直接放到结果代码中,而不是引用共享值。

常量之间的区别在于作用域——就像非const声明一样,要考虑的主要问题是可以从哪里访问这些值。现在,哪个声明更干净是无关紧要的,足以值得一场史诗级的火焰大战…