由於沒有後綴來表示字節文字,並且您必須使用強制轉換(或分配給字節變量),所以我使用以下代碼來確保使用Write(byte)超載而不是寫(INT):類似binaryWriter.Write((字節)67)是否涉及運行時間轉換?
binaryWriter.Write((byte)67)
如果編譯後的代碼實際上在運行時,或者如果編譯IL執行投要麼有東西等同於字節的文字或專門後綴我想指出的方法,其超載用來?
由於沒有後綴來表示字節文字,並且您必須使用強制轉換(或分配給字節變量),所以我使用以下代碼來確保使用Write(byte)超載而不是寫(INT):類似binaryWriter.Write((字節)67)是否涉及運行時間轉換?
binaryWriter.Write((byte)67)
如果編譯後的代碼實際上在運行時,或者如果編譯IL執行投要麼有東西等同於字節的文字或專門後綴我想指出的方法,其超載用來?
最簡單的,你可以做回答這些問題是看生成的IL代碼:
ldc.i4.s 67
callvirt instance void [mscorlib]System.IO.BinaryWriter::Write(unsigned int8)
首先推動你的文字到堆棧INT32使用短表(適用於整數127 -128之間)。這正是如果你聲明字節變量並使用它會發生什麼。不要讓「作爲int32」混淆你 - 你不能推單字節堆棧,所以它總是推送至少4個字節(ldc.i4系列指令)。
第二次調用正確的過載。
現在會發生什麼,如果我們不會投到字節?
ldc.i4.s 67
callvirt instance void [mscorlib]System.IO.BinaryWriter::Write(int32)
第一個指令是完全一樣的,然後只是一個過載被調用。 所以,回答你的問題是:沒有強制轉換,編譯器只是明確說明要使用哪個超載。
我在想,如果編譯後的代碼實際上在運行時
沒有執行投 ,它不會。對於兩個過載M(int n)
和M(byte b)
,M(67)
總是調用前者,根據C#語言規範第7.5.3.2章,因爲67
是int
的字面意思。
如果編譯IL要麼有 字節的文字
沒有,沒有字節文字像67L
/67UL
/67D
...
特別的東西相當於一個後綴指出使用哪種過載方法
您可以使用顯式轉換(或指定給一個byte
變量)就像你在這個問題做了什麼,或者寫一個擴展方法「重命名」原有的功能是這樣的:
public static class Ext
{
public static void WriteByte(this BinaryWriter writer, byte b)
{
writer.Write(b);
}
}
它只是選擇過載。技術背景非常深刻,讓你進入處理器設計,你可以通過使用谷歌搜索「c整數推廣」瞭解更多。適用於C語言,它更好地隱藏在C#中,但原理相同。最隱祕的情況是它不能被隱藏,不得不使用轉換將表達式的值存儲回字節中。 –