由于没有后缀来指示字节文字并且您必须使用强制转换(或分配给字节变量),我使用以下代码来确保改用 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/