C#基础-第4章:类型基础
4.1 本章主要内容:
- 所有类型都从System.Object派生
- 类型转化
- 命名空间和程序集(无代码演示)
- 运行时的相互关系(无代码演示)
/* */ 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; } }

浙公网安备 33010602011771号