• 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 关键字时,会在堆上初始化类型对象和普通对象。

    当我们运行完上面的四行代码之后,内存中的布局大家应该可以想象出来了,如下图所示。

    运行完上面四行代码后的内存布局

更多...

加载中...