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

vmg*_*vmg 5 c# string constants

类级字符串常量与方法级字符串常量之间有什么显着差异吗?编译器会识别常量并应用常量折叠吗?或者总是会创建 nw 对象?

这是示例:类级常量

class A
    {
        private const string Sid = "sid";
        private const string Pid = "pid";

        public void Do()
        {
            Console.WriteLine(Sid);
            Console.WriteLine(Pid);
        }
    }
Run Code Online (Sandbox Code Playgroud)

方法级常量:

class B
    {
        public void Do()
        {
            const string Sid = "sid";
            const string Pid = "pid";

            Console.WriteLine(Sid);
            Console.WriteLine(Pid);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 1

字符串常量是较新的“内联”*,因为它们是真正的对象。编译器总是将同一字符串常量的各个部分合并在一起(即“a”+“b”与指定“ab”相同)。

字符串常量也可以“驻留”——这意味着相同值的所有常量都引用同一个实际字符串对象(据我所知,C# 编译器总是这样做)。

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

为了实现“共享常量”行为,需要使用readonly字段而不是const.

*“内联”直接放入结果代码中,而不是引用共享值。