2014-09-30 65 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

相关问题