4

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

const 字段是否在编译时转换为静态字段?(我知道您不能更改 a 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

4 回答 4

10

来自 Jon Skeet -为什么我不能同时使用 static 和 const

所有常量声明都是隐式的 static ,并且 C# 规范声明禁止(冗余)包含 static 修饰符。

于 2012-08-30T12:05:49.357 回答
5

常量是隐式静态的。

常量的想法是它永远不能改变并且在编译时被分配。如果常量不是静态的,它们将在运行时创建。

于 2012-08-30T12:05:45.297 回答
2

const 正如你所说的也是静态的。差异开始于 const 不能改变。

于 2012-08-30T12:06:16.870 回答
2

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

于 2012-08-30T12:06:53.917 回答