c# - 像 binaryWriter.Write((byte)67) 这样的东西是否涉及运行时转换?

标签 c# casting

由于没有后缀来指示字节文字并且您必须使用强制转换(或分配给字节变量),我使用以下代码来确保改用 Write(byte) 重载写入(整数):

binaryWriter.Write((byte)67)

而且我想知道编译后的代码是否会在运行时实际执行该转换,或者编译后的 IL 是否具有等同于字节文字后缀的东西,或者具体说明使用了哪个方法重载?

最佳答案

要回答此类问题,最简单的方法就是查看生成的 IL 代码:

ldc.i4.s     67
callvirt     instance void [mscorlib]System.IO.BinaryWriter::Write(unsigned int8)

首先使用短格式(适用于 -128 到 127 之间的整数)将您的文字作为 int32 堆栈。如果您只声明字节变量并使用它,这正是会发生的情况。不要让“as int32”让您感到困惑 - 您不能将单个字节压入堆栈,因此它总是压入至少 4 个字节(ldc.i4 系列指令)。

第二次调用正确的过载。

现在如果我们不转换为 byte 会发生什么?

ldc.i4.s     67
callvirt     instance void [mscorlib]System.IO.BinaryWriter::Write(int32)

第一条指令完全相同,然后只是调用了另一个重载。 所以你的问题的答案是:没有执行任何类型转换,编译器只是明确说明要使用哪个重载。

关于c# - 像 binaryWriter.Write((byte)67) 这样的东西是否涉及运行时转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37247700/

相关文章:

Java:ClassCastException

java - 如何在运行时确定列表的内容类型

转换为较小类型时 C++ 截断

c++ - std::dynamic_pointer_cast 未正确向下转换

c# - ASP.NET 中的 P/Invoke(从 dll 读取/写入文本文件)

c# - 禁用旋转、平移和捏合缩放手势

c# - 在不同的特定字符之前返回单词

flutter - 使用 flutter_local_notifications 时,如何在 Flutter 中将 Future<Null> 转换为 Future<dynamic>?

C# FindAll 方法 : I am struggling with the syntax

c# - 返回 bool 的异步方法