C#基础-第4章:类型基础

4.1 本章主要内容:

  1. 所有类型都从System.Object派生
  2. 类型转化
  3. 命名空间和程序集(无代码演示)
  4. 运行时的相互关系(无代码演示)

 

/* */
using System;

//该类型隐式派生自System.Object
internal class Employee /* : System.Object */
{
    //所有的类都从System.Object.
}

internal class Manager : Employee
{
}


public static class Program
{

    public static void Main()
    {
        /*
         ===========================================================
         程序测试运行入口
         ===========================================================
         */
        Main1();
        Main2();
        Main3();
    }

   
    public static void Main1()//(P83)
    {

        //不需要转型,因为new返回一个Employee对象
        //而Object是Employee的基类型
        Object o = new Employee();

        //需要转型,因为Employee派生自Object.
        //其他语言(比如 Visual Basic)也许不要求像
        //这样进行强制类型转换
        Employee e = (Employee)o;
    }

    public static void Main2()//(P84)
    {

         // 构造一个Manager对象,把它传给PromoteEmployee,
        //Manager "属于"(IS-A) Employee,所以PromoteEmployee能成功运行
        Manager m = new Manager();
        PromoteEmployee(m);

        //构造一个DateTime对象,把它传给PromoteEmployee。
        //DateTime 不是从 Employee 派生的,所以PromoteEmployee
        //抛出 System.InvalidCastException 异常
        DateTime newYears = new DateTime(2007, 1, 1);
        PromoteEmployee(newYears);
    }


    public static void PromoteEmployee(Object o)//(P84)
    {
        //编译器在编译时无法准确地获取对象o
        //引用的是什么类型,因此编译器允许代码
        //通过编译。但在运行时,CLR知道了o引用
        //的是什么类型(在每次执行转型的时候),
        //所以它会核实对象的类型是不是Employee或者
        //从Employee派生的任何类型

        Employee e = (Employee)o;
    }

    public static void PromoteEmployee2(Object o)//(P85)
    {
        if (o is Employee)
        {
            Employee e = (Employee)o;
        
            // 在if语句剩余的部分使用e
        }
    }
    public static void PromoteEmployee3(Object o)//(P85)
    {

        Employee e = o as Employee;
        if (e != null)
        {
            //在if语句中使用e
        }
    }

    internal class B//(P85)
    { //  基类 Base class
    }
    internal class D : B
    { // 派生类 Derived class
    }

    private static void Main3()//(P86)
    { 
        // 教程里面(表4-3 类型安全性测试)代码 

        Object o1 = new Object();
        Object o2 = new B();
        Object o3 = new D();
        Object o4 = o3;
        B b1 = new B();
        B b2 = new D();
        D d1 = new D();
        //B b3 = new Object();
        //D d2 = new Object();
        B b4 = d1;
        //D d3 = b2;
        D d4 = (D)d1;
        D d5 = (D)b2;
        D d6 = (D)b1;  // 抛出异常 InvalidCastException
        B b5 = (B)o1;  // 抛出异常 InvalidCastException
        B b6 = (D)b2;
    }
}

 

posted @ 2017-10-10 12:27  eric.yuan  阅读(197)  评论(0)    收藏  举报