我一直使用(ulong) 1
来表示64位数据类型中的1位.我想知道(ulong) 1
是否做了某种类型转换,并且比1ul
花了更多的时间.
只是好奇这会不会有什么不同.我认为他们两个在表现上完全一样.这是正确的吗,或者(ulong) 1
实际上更慢?
我一直使用(ulong) 1
来表示64位数据类型中的1位.我想知道(ulong) 1
是否做了某种类型转换,并且比1ul
花了更多的时间.
只是好奇这会不会有什么不同.我认为他们两个在表现上完全一样.这是正确的吗,或者(ulong) 1
实际上更慢?
不,当您使用带有编译时间常量和build-in numeric conversion(即(ulong) 1
)的强制转换时,不会发生运行时类型转换,因为编译器可以处理这样的事情,并且两种方法应该产生相同的IL/ASM.例如:
var x = 1ul;
var y = (ulong)1;
Console.WriteLine(x);
Console.WriteLine(y);
将产生the same IL:
.maxstack 1
.entrypoint
.locals init (
[0] uint64 x,
[1] uint64 y
)
IL_0000: ldc.i4.1
IL_0001: conv.i8
IL_0002: stloc.0
IL_0003: ldc.i4.1
IL_0004: conv.i8
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: call void [System.Console]System.Console::WriteLine(uint64)
IL_000c: nop
IL_000d: ldloc.1
IL_000e: call void [System.Console]System.Console::WriteLine(uint64)
IL_0013: nop
IL_0014: ret
来自语言规范-12.23 Constant expressions:
常量表达式中只允许使用以下构造:
- 字面值(包括
null
个字面值).- ...
- 强制转换表达式.
- ...
因此,基本上在这种情况下,(ulong) 1
将被视为与整型文字1ul
一样的常量.
另请参阅文件的第Integer literals节.