[英]Casting value-type constants
這不是我真正擔心性能的問題,而是更多的學術問題。 我真的很好奇。 我還從有限的編程經驗中學到,編譯器只有一半的時間才是明智的。
我有一個靜態類,其中定義了一個常量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
創建一個常量浮點數,還是將整數轉換為每個循環的浮點數?
語言規范在這里幫助了我們。 C#5規范的7.19節規定:
常量表達式必須是空文字或具有以下類型之一的值:sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,object,string或任何其他類型枚舉類型。 常量表達式中僅允許以下構造:
- ...
- 如果目標類型是上面列出的類型之一,則強制轉換表達式。
...
只要表達式滿足上面列出的要求,就會在編譯時對表達式求值。 即使表達式是包含非恆定構造的較大表達式的子表達式,也是如此。
您還可以通過查看IL來驗證這一點,在這種情況下,它具有:
IL_000a: ldc.r4 69.
在加載除法運算的除數時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.