[英]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.