zoukankan      html  css  js  c++  java
  • 漫话CLR ---- 类型基础

      C#中所有的类型都是从 System.Object 派生而来,也就是所谓的单根继承.不管你是值类型也好,引用类型也好亦或是自定义的类型,全部都是派生自 System.Object.显示指定就是显示派生,不指定也会隐式派生.此基类有几个公共方法,想必大家都已经熟悉并多少用过了.

      ToString() 默认返回的是对象的类型全称 : this.GetType().FullName.当然很多时候也会被重写,比如 int.ToString() , XXX.ToString()以显示一些有用的信息.

      GetType() 非虚方法,返回对象的类型信息.

      Equals() 用来判断对象的一致性,和 == 运算符还是有点区别的.

      GetHashCode() 作为哈希表中的Key使用,其实这个方法设计到基类中并不恰当,本应在一个接口当中的.

      还有两个受保护的方法:

      MemberwiseClone() 创建类型的一个新实例,注意和 Clone() 的区别,深浅拷贝.

      Finalize() 垃圾回收之前调用,如果需要进行一些清理工作,可以重写这个方法.

      CLR要求所有的对象都使用new操作符来创建.

    //对象的内存拷贝,MemberWiseClone() 和 反序列化 的时候貌似没有用到 new 操作符,标记下,回来查个资料瞅瞅.

      当然,你可能见过这种创建对象的方式.其实内部也只是用工厂模式封装了下,最基本的一定还是 new 操作.

    Entity e = Factory.Create("XXX");

      new所做的事情;

      1.计算实例化类型所需的字节大小,包括定义的字段(包含父类),一些额外的CLR用于管理对象的成员----类型对象指针 和 同步块索引;

      2.从托管堆分配内存并初始化为零;

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

      4.调用其构造函数.

      类型转换.有显示和隐式两种.相关的操作有 as is 操作符,和 (XXXObject)Object 强制转换方法.推荐使用 as. 标准库中也有一些常用的转换方法,在 Convert 中,还有一些解析方法,比如 int.Parse(XXX) 和 int.TryParse(XXX,out XXX),合理使用这些方法是我们编写程序必备的技能之一.

      命名空间用来对类型进行逻辑分组,所以同一个命名空间中的内容有可能在一个程序集中,也有可能在其他程序集中.同理,不同的命名空间也可以存在一个相同的程序集中.使用 using 命名空间; 的方式来简化输入代码的数量是我对其最直观的认识.如果有 XXX.YYY.Control 和 XXX.XXX.Control在同一类中使用,也可以使用 using AdvControl = XXX.XXX.Control; 也可以消除类型歧义.

      对象生成 动态图解 (待续...)

  • 相关阅读:
    USACO07FEB银牛派对
    求环总结
    NOIP2015信息传递(拓扑排序 / 并查集)
    APIO2012dispatching (左偏树)
    [编程题]山寨金闪闪 (面试题)
    【小米oj】简单直接全排列
    【小米oj】寻找归一数字
    【小米oj】dreamstart 的催促
    【小米oj】打羽毛球的小爱同学
    【小米oj】石头收藏家
  • 原文地址:https://www.cnblogs.com/woodywu/p/3224552.html
Copyright © 2011-2022 走看看