WEB开发网
开发学院软件开发C语言 《C# to IL》第四章 关键字和操作符(上) 阅读

《C# to IL》第四章 关键字和操作符(上)

 2009-06-03 08:30:41 来源:WEB开发网   
核心提示: Output10我们现在要解释IL是如何实现传递引用的,与C#不同,《C# to IL》第四章 关键字和操作符(上)(4),在IL中可以很方便的使用指针,IL有3种类型的指针,在反汇编这个程序时,我们将无法区别ref和out,当函数abc被调用时,变量i会被作为一个引用参数传递到函数中

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
}
}

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:to IL 第四章

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接