2013-03-06 43 views
4

在類級別字符串常量與方法級別字符串常量之間是否存在任何顯着差異?編譯器是否會識別常量並應用常量摺疊?或者nw對象總是會被創建?類級別字符串常量與方法級別字符串常量

下面是例如:類級consts

class A 
    { 
     private const string Sid = "sid"; 
     private const string Pid = "pid"; 

     public void Do() 
     { 
      Console.WriteLine(Sid); 
      Console.WriteLine(Pid); 
     } 
    } 

方法級別的常量:

class B 
    { 
     public void Do() 
     { 
      const string Sid = "sid"; 
      const string Pid = "pid"; 

      Console.WriteLine(Sid); 
      Console.WriteLine(Pid); 
     } 
    } 
+1

_「編譯器會識別常量並將它們內聯到**嗎?」_這是什麼_inline_在這種情況下? – gdoron 2013-03-06 01:39:34

+0

對不起,我的意思是不斷摺疊,以便每次訪問方法時不會刪除和創建對象。 – vmg 2013-03-06 01:46:03

+0

'Const'是一個靜態變量,所以是的,每次都不會創建。 – gdoron 2013-03-06 01:48:56

回答

0

字符串常量更新「內聯」*,因爲它們是真正的對象。編譯器將總是合併相同字符串常量的部分(即「a」+「b」與指定「ab」相同)。

字符串常量也可以「interned」 - 意味着同一個值的所有常量都指向相同的實際字符串對象(就我所知,C#編譯器總是這樣做)。

除了在編譯時儘可能多地計算(即2 * 2 * 4與指定16相同),數值常量可以「內聯」到使用它們的地方。

要實現「共享常量」行爲,需要使用readonly字段而不是const

*「inline」直接放置在生成的代碼中,而不是引用共享值。

1

常數之間的差是在範圍 - 就像用非const聲明,則要考慮的主要問題是可以從哪裏訪問這些值。現在,哪個聲明更清潔是無關緊要的,值得史詩般的火焰戰爭......

+0

這種情況下的範圍只在編譯時才正確?所以一旦編譯應用程序,無論如何不重要? – 2013-03-06 01:50:38

+0

正確的說,const是一個const,無論它在哪裏 - 它在編譯後並沒有真正的範圍,因爲它被替換了。 – 2013-03-06 01:58:27