《C# to IL》第四章 关键字和操作符(上)
2009-06-03 08:30:41 来源:WEB开发网Output
10
我们现在要解释IL是如何实现传递引用的。与C#不同,在IL中可以很方便的使用指针。IL有3种类型的指针。
当函数abc被调用时,变量i会被作为一个引用参数传递到函数中。在IL中,ldloca.s指令会被调用,它把变量的地址放到栈上。替代地,如果这个指令是ldloc,那么就会把变量的值放到栈上。
在函数调用中,我们添加符号&到类型名称的结尾来表示变量的地址。数据类型后面的&后缀表示变量的内存位置,而不是在变量中包括的值。
在函数本身中,ldarg.1用于把参数1的地址放到栈上。然后,我们把想要初始化的数值放到栈上。在上面的例子中,我们首先把变量i的地址放到栈上,随后是我们想要初始化的值,即10。
stind指令把出现在栈顶的值,也就是10,放到变量中,这个变量的地址存储为栈上的第2项。在这个例子中,因为我们传递变量i的地址到栈上,所以变量i分配到值10。
当在栈上给出一个地址时,使用stind指令。它会使用特定的值填充该内存位置。
如果使用关键字ref取代out,那么IL还是会显示相同的输出,因为不管是哪种情形,变量的地址都会被放到栈上。因此,ref和out是C#实现中的“人为”概念,而在IL中没有任何等价的表示。
IL代码无法知道原始的程序使用的是ref还是out。因此,在反汇编这个程序时,我们将无法区别ref和out,因为这些信息在从C#代码到IL代码的转换中会丢失。
a.cs
class zzz
{
public static void Main()
{
string s = "hi" + "bye";
System.Console.WriteLine(s);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (class System.String V_0)
ldstr "hibye"
stloc.0
ldloc.0
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
}
- ››Illustrator CS6 打造孔雀花纹的字体
- ››TOscilloscope 仿Windows任务管理器CPU使用记录组...
- ››Illustrator教程:设计制作几何花瓣LOGO
- ››Illustrator实例教程:漂亮证卡变幻线的制作
- ››Illustrator文字教程:制作漂亮质感描边字
- ››Illustrator鼠绘:渐变工具运用绘制金属闹钟
- ››Illustrator鼠绘:教你画一个可爱卡通宝宝教程
- ››Illustrator简单四步做透明气泡教程
- ››Illustrator教程:制作漂亮的新货吊牌
- ››Illustrator教程:改变圆角矩形中一个圆角半径
- ››Illustrator教程:如何用网格工具绘制花瓣
- ››Illustrator涂抹命令打造文字草图特效
更多精彩
赞助商链接