const字段是否在编译时转换为静态字段?

时间:2012-08-30 12:03:08

标签: c#

为什么我可以调用TheFakeStaticClass.FooConst,就像它是静态的,当它没有被声明为静态时?

const字段是否在编译时转换为静态字段? (我知道你不能改变一个const,因此你只需要“一个实例”。我之前使用过许多const,就像Math.PI之前一样,但从未考虑过,现在我做了,现在做了我很好奇。

namespace ConstTest
{
    class Program
    {
        class TheFakeStaticClass
        {
            public const string FooConst = "IAmAConst";
        }

        class TheRealStaticClass
        {
            public static string FooStatic = "IAmStatic";
        }

        static void Main()
        {
            var fc = TheFakeStaticClass.FooConst; // No error at compile time!
            var fs = TheRealStaticClass.FooStatic;
            var p = new Program();
            p.TestInANoneStaticMethod();
        }

        private void TestInANoneStaticMethod()
        {
            var fc = TheFakeStaticClass.FooConst;
            var fs = TheRealStaticClass.FooStatic;
        }
    }
}

4 个答案:

答案 0 :(得分:10)

来自Jon Skeet - Why can't I use static and const together

  

所有常量声明都是隐式静态,而C#   规范声明静态的(冗余)包含   修饰语被禁止。

答案 1 :(得分:5)

Constants are implicitly statics.

常量的概念是它必须永远不会改变并在编译时分配。如果常量不是静态,则它们将在运行时创建。

答案 2 :(得分:2)

const就像你说的那样静态。差异开始,const不能改变。

答案 3 :(得分:2)

没有。它们是内联的。 这意味着每次编译器看到常量的使用时,它都会将使用值替换为常量的值。这就是必须在编译时评估consts的原因。