zoukankan      html  css  js  c++  java
  • .NET类型基础

    CLR要求每个类型最终都从system.Object类型派生,

    所有的类型最终都从system.Object派生,所以每个类型的每个对象都有一组最基本的方法,

    如:Equals,判断两个对象值是否相同,相同返回true,否则返回false.

    GetHashCode:返回对象的值得一个哈希码.

    ToString():默认返回类型的完整名称.

    GetType():返回从Type派生的一个对象的实例.指出调用GetType的那个对象是什么类型.

    System.Object 受保护方法:

    MemberwiseClone:创建类型的一个新实例,并将新对象的实例字段设与this对象的实例字段完全一致,返回的是对新实例的引用. 

    Finalize:在垃圾回收器判断对象应该被作为垃圾收集之后,在对象的内存被实际回收之前,会调用这个虚方法,需要在回收之前执行一些清理工作的类型应该重写这个方法.

    CLR中要求所有对象都用 new 操作符来创建.例如: Employee  e =  new  Employee("dd");

    那么new 是做什么事情呢?

    A: 首先new会先计算类型以及所有基类型中定义的所有字段需要的字节数.堆上的每个对象都需要一些额外的成员---"类型对象指针,同步块索引",这些成员由CLR用于管理对象,这些额外的成员最终也会计入对象的大小.

    B: 在托管堆中分配指定类型要求的字节数,分配对象的内存,分配的所有字节都设为0;

    C: 初始化类型对象指针和同步块索引.

    D: 调用类型的实例构造器,传入在对new的调用中指定的实参.(也就是例子中的dd);

    E:  最后返回指定新建对象一个引用(指针),这个引用会保存在变量(例子)e中,

    new操作符,无法对其创建的对象进行显式释放,CLR通过自身的垃圾回收机制自动释放对象的内存.

    CLR最重要的一个特性就是类型安全.也就是说在运行时,CLR总是知道一个对象的类型是什么.

    我们在开发的时候,经常需要将一个类型转换为其他的各种类型,在此,CLR允许将一个对象转换为它的类型后者它的任何基类型,向基类型转换被认为是一种安全的隐式转换,将对象转换为它的某个派生类型时,只能是显式转换.这样的转换可能会在运行时失败.

    as和is操作符来转型.

    在C#语言中进行类型转换的另一种方式是使用is操作符.is检查一个对象是否兼容于指定的类型,并返回一个Boolean值,true或false,is操作符永远不会抛出异常.

    Object  o  =  new  Object();
    Boolean  b  =  (o is Object); // true
    Boolean  b2 = (o is Employee)//false
    

     如果引用的为null,is操作符总是返回false,因为没有可检查其类型的对象.

    一般is会像这样的来使用.

     if(o is Employee) { Employee e = (Employee)o; } 

    is操作符的性能比较低,因为CLR首先必须判断变量引用的对象的实际类型,然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型.

    as操作符就是为了简化这个代码的写法.同时提升性能.

    Employee e = o  as  Employee;
    if(o != null)
    {}

    如果o兼容于Employee类型,as操作符会返回同一个对象的一个非null引用,如果不兼容则会返回null.
    as操作符造成CLR只校验一次对象的类型.所以会比IS快.

    as操作符的工作方式和强类型转换一样.只是他不会抛出异常,只会返回null.所以在使用时,要判断对象是否为null.

  • 相关阅读:
    进程 触发器
    关于 if条件 光标 循环的综合应用
    3-15记录
    day3.python 学习之列表
    day2: python3.5学习——逻辑判断
    day1: python3.5学习
    OpenGL_曲线函数
    OpenGL_赛平斯基垫片
    【quick-cocos2d-x 游戏开发之一】开发工具sublime text及其强力插件QuickXDev
    Python正则表达式指南
  • 原文地址:https://www.cnblogs.com/MR-LIUB/p/3710520.html
Copyright © 2011-2022 走看看