zoukankan      html  css  js  c++  java
  • 读<<CLR via C#>>总结(2) 对象创建的原理和两种类型转换方法

    一,对象创建的原理

      CLR要求所有的对象都用new操作符来创建,如下代码:

    namespace NewobjectDemo1
    {
    class Employee
    {
    private string Name;
    //构造函数
    public Employee(string name)
    {
    Name = name;
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Employee e = new Employee("Mcgrady");//使用new操作符创建对象
    }
    }
    }

      编译后的IL代码:


      注:new操作符在IL中的对应的代码为newobj。

      实际上new操作符帮我们做了以下事件:

      1,计算类型及其所有基类型所需要的字节数并依此分配内存大小。

      2,初始化对象的"类型对象指针"和"同步块索引"成员。

      3,调用类型的实例构造器,向其传入在对new 调用中指定的任何实参(上例中就是字符串"Mcgrady")。

    二,两种类型转换方法

      方法一:隐式转换和显式(或叫强制)转换

          从派生类型向它的基类型转换叫隐式转换,而从基类型向它的某个派生类型转换叫显式转换。如下代码:

    namespace NewobjectDemo1
    {
    //该类型隐式派生自Object
    class Employee
    {
    }
    class Program
    {
    static void Main(string[] args)
    {
    //隐式转换,因为new返回一个Employee对象,而Object是Employee的基类
    Object o = new Employee();

    //显式转换,因为Employee派生自Object
    Employee e=(Employee)o;
    }
    }
    }

      

      方法二:使用is和as操作符来转型

          is检查一个对象是否兼容于指定的类型并返回一个bool值:true或false;as操作符执行实际的转换。如下代码:

    namespace NewobjectDemo1
    {
    //该类型隐式派生自Object
    class Employee
    {
    }
    class Program
    {
    static void Main(string[] args)
    {
    object o = new object();

    //检查对象o是否兼容于类型Employee
    if (o is Employee)//如果对象引用为null,is操作符总是返回false,注意is操作符永远不会抛出异常
    {
    Employee e = o as Employee;//等价于:Employee e=(Employee)o

    //在使用变量e之前最好检查引用是否为null
    if (e != null)
    {
    //有if语句中使用e
    e.ToString();
    }
    }
    }
    }
    }
  • 相关阅读:
    《我想进大厂》之mysql夺命连环13问
    抽象数据类型的表示与实现
    数据结构两个层次——逻辑结构和存储结构
    单链表的两种构造函数
    使用malloc函数或new运算符为链表结点分配内存空间
    基于Vue全家桶开发的前端组件管理平台
    JS菱形镂空
    JS使用for循环实现九九乘法表数字颜色不同
    JS——个人所得税
    JAVA常见关键字
  • 原文地址:https://www.cnblogs.com/mcgrady/p/2415537.html
Copyright © 2011-2022 走看看