我一直使用(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节.

Csharp相关问答推荐

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

System.Text.Json数据化的C#类映射

为什么总输出就像12.3没有一分一样?

如何分配对象后的class的属性?

. net依赖注入如何避免服务类中的新

WPF DataGrid中的三维数据

Blazor Foreach仅渲染最后一种 colored颜色

限制特定REST API不被访问,但部署代码

C#XmlSerializer-输出控制新行的多个XML片段

在实体框架中处理通用实体&S变更跟踪器

如何将MongoDB序列化程序设置为内部对象属性

如何通过属性初始化器强制初始化继承记录内的属性?

为什么C#认为这个非托管 struct 有一个重叠

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

VS 2022与VS 2019:如何/为什么创建额外的任务?

在C#中有没有办法减少大型数组中新字符串的分配?

ReadOnlyMemory访问基础索引的替代方案

如何解决System.StackOverflowException:抛出System.StackOverflowException类型的异常.&# 39;生成随机代码时发生异常?

在C#和HttpClient中使用REST API

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果