2014-04-30 67 views
1

這是一個學術問題,而不是我真正擔心表現的問題。我只是很好奇而已。在我的編程經驗中,我也學會了編譯器在一半時間內只有智能。鑄造值型常量

我有一個靜態類,其中定義了一個常量int,我需要用另一個整數除該常量。現在,我需要從該部門返回的浮動值,所以我不能將它們都作爲整數保留。

const int CONSTANTINTEGER = 69; 
int integer = 0; 
float floatValue = 0f; 

for(integer = 0; integer < CONSTANTINTEGER; integer++) { 
    float floatValue = integer/(float)CONSTANTINTEGER; 
    //use floatValue for algorithm..... 
} 

現在,我的問題:是編譯器足夠聰明來代替(float)CONSTANTINTEGER創造一個恆定的浮動還是它轉換爲浮動每一個循環的整數?

+0

看起來像它會投入每次迭代,就像在一個循環內聲明一個變量似乎它會被重新創建,並且每次迭代都會超出範圍。但是,老實說,我不確定 –

+2

您可以編譯它,然後在ILSpy中查看已編譯的程序集。如果你看IL,你會看到它在哪裏演出。 – Amy

+0

@Amy:或者說,它不是*在做演員,因爲它*是一個常量。它需要每次都將'integer'轉換爲'float',而不是'CONSTANTINTEGER'。如果您不同意,請隨時添加更多細節的答案,我們可以更仔細地看。 –

回答

4

語言規範可以幫助我們在這裏。部分中的C#5規範規定的7.19:

常量表達式必須是null文本或與以下類型之一的值:爲sbyte,字節,短,USHORT,INT,UINT,長,ULONG,炭,float,double,decimal,bool,object,string或任何枚舉類型。僅允許下列構造在常量表達式:

  • ...
  • 轉換表達式,提供的目標類型是上面列出的類型之一。

...

只要表達式滿足上述要求,該表達式在編譯時進行評價。即使表達式是包含非常量結構的較大表達式的子表達式,情況也是如此。

您也可以通過查看IL,在這種情況下有驗證此:

IL_000a: ldc.r4  69. 

時,它加載的除法運算除數。