C#类型转换和GetType方法
在运行时,可以通过 GetType 方法获得对象指向的类型对象的类型。
当需要类型转换时,有如下的几种情况:
- 将一个对象转换为它的基类型。
- 将一个对象转换为它的派生类型。
- 将一个对象转换为和它无关的类型(不是基类也不是派生类)。
假设我们有如下的两个类:
public class A { public int a { get; set; } } publie class B : A { public int b { get; set; } }
将一个对象转换为它的基类型
这种情况永远都能转换成功,所以 C# 不要求额外的语法。当然,也可以使用显式转换:
A a = new B(); Console.WriteLine(a.GetType() ) ; // B A a2 = (A)new B(); Console.WriteLine (a2 . GetType () ) ; // B
此时,我们看到 GetType 方法返回的值是“当前命名空间名 .B”。
但是如果我们试图在 Visual Studio 中访问对象 a/a2 的成员,会发现它只有 a —个成员,并没有 b (实际上,可以编写 IL 访问 B 的方法)。那么 a/a2 的类型究竟是什么呢?(答案是A)
实际上,根据之前对象初始化的知识,我们已经知道,在使用 new 关键字时,会在堆上初始化类型对象和普通对象。
当我们运行完上面的四行代码之后,内存中的布局大家应该可以想象出来了,如下图所示。
发表评论