2012-08-30 46 views
4

爲什麼我可以調用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

好吧,它不是'靜態',因爲它不能改變。 – kenny

+1

Thx爲所有好的答案 - 經驗教訓! – radbyx

回答

2

const就像你說的那樣也是靜態的。差異開始,const不能改變。

2

不,他們是內聯的。 這意味着每次編譯器看到該常量的用法時,它就會將該用法替換爲該常量的值。這就是consts必須在編譯時進行評估的原因。