【问题标题】:class-level string constants vs method-level string constants类级字符串常量与方法级字符串常量
【发布时间】:2013-03-06 01:37:06
【问题描述】:

类级字符串常量与方法级字符串常量之间是否存在显着差异。编译器会识别常量并应用常量折叠吗?还是总是会创建 nw 对象?

这里是示例:类级常量

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);
        }
    }

【问题讨论】:

  • “编译器会识别常量并内联它们吗?”在这种情况下什么是内联
  • 对不起,我的意思是常量折叠,所以每次方法访问时都不会删除和创建对象。
  • Const 是一个静态变量,所以是的,它不会每次都创建。

标签: c# string constants


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    常量之间的区别在于范围 - 就像非常量声明一样,要考虑的主要问题是可以从哪里访问这些值。现在,哪个声明更干净已经无关紧要,值得进行一场史诗般的火焰战争......

    【讨论】:

    • 这种情况下的范围仅在编译时正确吗?所以一旦应用程序被编译,它就没有关系了吗?
    • 对,一个 const 无论在哪里都是一个 const - 它在编译后实际上没有作用域,因为它被替换了。
    猜你喜欢
    • 2018-06-13
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2014-06-08
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多