2014-09-30 33 views
3

這以下C#代碼:IL代碼加載的Int16如的Int32

short first = 1; 
short second = 2; 
bool eq1 = (first.Equals(second)); 

的代碼轉換爲:

IL_0001: ldc.i4.1  
IL_0002: stloc.0  // first 
IL_0003: ldc.i4.2  
IL_0004: stloc.1  // second 
IL_0005: ldloca.s 00 // first 
IL_0007: ldloc.1  // second 
IL_0008: call  System.Int16.Equals 
IL_000D: stloc.2  // eq1 

ldloca.s 00 - 局部變量的裝入地址與索引INDX,短形式。

ldloc.1 - 將本地變量1加載到堆棧上。

爲什麼不是這兩個命令是ldloca.s(兩個變量都是short類型)?

+1

請注意這不是完全相同的問題,因爲http://stackoverflow.com/questions/17511737/int16-bytes-capacity-in-net,而是一個具體的案例問題。 – Ofiris 2014-09-30 09:06:33

+2

順便說一句,'.s'與'short'類型無關,如果這就是你的困惑。 (這只是表示變量號碼<256)。 – svick 2014-09-30 09:30:57

+0

@svick,謝謝,它使它更清晰,我認爲它加載了一個'Int16'的值。 – Ofiris 2014-09-30 11:15:06

回答

8

的值類型的所有實例的方法有ref T類型的隱含this參數,而不是T型的,這就是爲什麼你first變量需要ldloca。但System.Int16.Equals的參數類型爲System.Int16,沒有任何ref,因此您的second變量不需要(且不能與ldloca一起傳遞)。

+1

您提到哪種方法是_first需要使用'ldloca'_?我不明白。 – 2014-09-30 11:10:25

+0

@SonerGönül第一個值,不是第一個方法。將看看我是否可以改寫更清楚。 – hvd 2014-09-30 11:18:43

+0

謝謝,這樣更好。但我找不到任何關於_value類型的所有實例方法在C#5.0規範中都含有'ref T'類型的參數,而不是'T'_類型。或者我沒有在['Int16.Equals(Int16)'](http://referencesource.microsoft.com/mscorlib/R/7e0c773f8f59d685.html)「方法或任何其他值類型方法定義上看到任何'ref'用法。其實我有點困惑。你能開導我嗎? – 2014-09-30 12:31:39