为什么我可以调用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;
}
}
}
答案 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的原因。