2016-05-16 47 views
2

由於沒有後綴來表示字節文字,並且您必須使用強制轉換(或分配給字節變量),所以我使用以下代碼來確保使用Write(byte)超載而不是寫(INT):類似binaryWriter.Write((字節)67)是否涉及運行時間轉換?

binaryWriter.Write((byte)67) 

如果編譯後的代碼實際上在運行時,或者如果編譯IL執行投要麼有東西等同於字節的文字或專門後綴我想指出的方法,其超載用來?

+0

它只是選擇過載。技術背景非常深刻,讓你進入處理器設計,你可以通過使用谷歌搜索「c整數推廣」瞭解更多。適用於C語言,它更好地隱藏在C#中,但原理相同。最隱祕的情況是它不能被隱藏,不得不使用轉換將表達式的值存儲回字節中。 –

回答

1

最簡單的,你可以做回答這些問題是看生成的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) 

第一個指令是完全一樣的,然後只是一個過載被調用。 所以,回答你的問題是:沒有強制轉換,編譯器只是明確說明要使用哪個超載。

0

我在想,如果編譯後的代碼實際上在運行時

沒有執行投 ,它不會。對於兩個過載M(int n)M(byte b),M(67)總是調用前者,根據C#語言規範第7.5.3.2章,因爲67int的字面意思。

如果編譯IL要麼有 字節的文字

沒有,沒有字節文字像67L/67UL/67D ...

特別的東西相當於一個後綴指出使用哪種過載方法

您可以使用顯式轉換(或指定給一個byte變量)就像你在這個問題做了什麼,或者寫一個擴展方法「重命名」原有的功能是這樣的:

public static class Ext 
{ 
    public static void WriteByte(this BinaryWriter writer, byte b) 
    { 
     writer.Write(b); 
    } 
}