2012-08-30 2 views
4

Почему я могу позвонить TheFakeStaticClass.FooConst, как будто он статичен, когда он не объявлен статическим?Преобразуются ли константные поля в статические поля во время компиляции?

Поля 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

ответ

10

от Jon тарелочкам -.. Why can't I use static and const together

Все константы декларации неявно статические, а спецификация C# утверждает, что (резервный) включение статического модификатора запрещается.

5

Constants are implicitly statics.

идея постоянной является то, что он никогда не должен измениться и назначается на время компиляции Если константы не статика они будут созданы во время выполнения

2

const, как вы говорите, также статично. Разница начинается с того, что const нельзя изменить.

2

Нет. Они встроены. Это означает, что каждый раз, когда компилятор видит использование константы, он заменяет использование значением константы. Вот почему consts необходимо оценивать во время компиляции.

Смежные вопросы