您的位置:首页 > 编程语言 > C#

《CLR via C#》读书笔记 之 类型基础

2013-02-27 10:31 531 查看

第四章 类型基础

2013-02-27

4.2 类型转换
4.4 运行时相互关系
例1 展示了在调用方法时,线程栈是如何处理局部变量和参数的

托管堆的内存分配机制
例2 展示了在调用方法时,托管堆是如何工作的

JIT何时创建类型对象
创建对象
调用静态方法
调用非虚实例方法
调用的是虚实例方法

只有多态方法,没有多态实例字段

小结

参考

4.2 类型转换

返回

CLR最重要的特性之一就是类型安全性。在运行时,CLR总能知道一个对象时什么类型。由于GetType是非虚方法,所以一个类型不可能伪装成另一个类型,通过这个方法,可以知道对象的确切类型。

CLR允许将一个对象转换为它的(实际)类型或它的任何基类型。

使用C#is和as操作符

is 检查一个对象是否兼容于(实际类型或基类型)指定类型,并返回一个布尔值。

as 检查一个对象是否能强制转换成指定类型,若不可以,返回null

4.4 运行时相互关系

返回

本节将揭示类型、对象、线程栈和托管堆在运行时的相互关系。此外,还将解释调用静态方法、实例方法和虚方法的区别。

例1 展示了在调用方法时,线程栈是如何处理局部变量和参数的

返回

图1展示了已加载了CLR的一个进程。在这个进程中,可能有多个线程。一个线程创建时,会分配到1MB大小的栈。这个栈空间用于向方法传递实参,也用于方法内部的局部变量。在图中,线程已执行了一些代码,准备调用M1方法。

static void Main(string[] args)
{
Base.StaticMethod();      //Base static method.
Derived.StaticMethod();   //Base static method.

Base b=new Base();
Derived d=new Derived();
Base c = new Derived();

b.NonStaticMethod();      //Base non static method.
d.NonStaticMethod();      //Derived non static method.
c.NonStaticMethod();      //Base non static method.

b.VirtualMethod();        //Base virtual method.
d.VirtualMethod();        //Derived virtual method.
c.VirtualMethod();        //Derived virtual method.

Console.WriteLine(b.name);//Base
Console.WriteLine(d.name);//Derived
Console.WriteLine(c.name);//Base

Console.Read();
}


View Code

只有多态方法,没有多态实例字段【2】

从上述调用虚方法的得知,多态是如何实现的,即使变量e的类型是基类Employee,但只要它指向的对象是派生类Manager,且有覆盖虚方法的实例方法实现,就会调用Manager中的方法。

但实例字段并不会覆盖,见如下代码:

class Employee
{
public string name = "Employee";
}

class Manager : Employee
{
public string name = "Manger";
}

class Program
{
static void Main(string[] args)
{
Employee e = new Manager();
Console.WriteLine(e.name);   //显示:Employee
}
}


上述代码,Employee e = new Manager(); 具体过程参见创建引用类型的实例的过程


小结:

在使用变量调用方法或字段时,只有调用的是虚实例方法,是根据变量指向的对象,再找指向对象指向的类型对象中找相应的方法(多态方法是这样实现的);

调用非虚实例方法或字段时,是直接根据变量的对象类型,找相应的方法或字段。

参考

返回

【1】 [你必须知道的.NET]第十九回:对象创建始末(下) /article/6958275.html

【2】 [你必须知道的.NET]第十五回:继承本质论 /article/6958298.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: