WEB开发网
开发学院软件开发C语言 《C# to IL》第二章 IL基础 阅读

《C# to IL》第二章 IL基础

 2009-06-01 08:31:09 来源:WEB开发网   
核心提示: 使用newobj的规则和调用一个函数的规则是相同的,函数名称的完整原型是必需的,《C# to IL》第二章 IL基础(5),在这个例子中,我们调用了无参数的构造函数,在这个例子中,我们使用它来移除一个zzz的实例,从而函数.ctor会被调用,在构造函数中

使用newobj的规则和调用一个函数的规则是相同的。函数名称的完整原型是必需的。在这个例子中,我们调用了无参数的构造函数,从而函数.ctor会被调用。在构造函数中,WriteLine函数会被调用。

正如我们先前承诺的,这里,我们将要解释指令ldarg.0。无论何时创建一个对象——一个类的实例,都会包括两个基本的实体:

函数

字段或变量,如data

当一个函数被调用时,它并不知道也不关心谁调用了它或它在哪里被调用。它从栈上检索它的所有参数。没有必要在内存中有一个函数的两份复制。这是因为,如果一个类包括了1兆的代码,那么每当我们对其进行new操作时,都会占据额外的1兆内存。

当new被首次调用时,会为代码和变量分配内存。但是之后,在new上的每一次调用,只会为变量分配新的内存。从而,如果我们有类的5个实例,那么就只有代码的一份复制,但是会有变量的5份独立的复制。

每个非静态的或实例函数都传递了一个句柄,它表示调用这个函数的对象的变量位置。这个句柄被称为this指针。this由ldarg.0表示。这个句柄总是被传递为每个实例函数的第1个参数。由于它总是被默认传递,所以在函数的参数列表中没有提及。

所有的操作都发生在栈上。pop指令移出栈顶的任何元素。在这个例子中,我们使用它来移除一个zzz的实例,它是通过newobj指令被放置在栈顶的。

a.cs

    class zzz
    {
        public static void Main()
        {
            System.Console.WriteLine("hi");
            new zzz();
        }
        zzz()
        {
            System.Console.WriteLine("bye");
        }
        static zzz()
        {
            System.Console.WriteLine("byes");
        }
    }

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

Tags:to IL 第二章

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