CLR要求每个类型最终都派生自System.Object

Object提供的公共方法:

  • Equals: 如果两个对象具有相同的值,就返回true
  • GetHashCode: 返回对象的哈希码
  • ToString:默认返回类型的完整名称(this.GetType().FullName)
  • GetType: 返回从type派生的一个实例

object的protected方法:

  • MemberwiseClone:这个非虚方法创建类型的新实例,并将新对象的实例字段设与this的字段完全一致
  • Finalize:在垃圾回收器判断对象应该作为垃圾回收之后。在对象的内存被实际回收之前,会调用这个虚方法。需要在回收内存钱执行清理工作的类型,应该重写该方法。

所有对象都需要使用new操作符,new的实际操作如下:

  1. 计算类型及其所有基类型定义的所有实例字段所需要的字节数。堆上哦度需要一些额外的开销成员(overhead成员)包括类型对象指针(type object pointer)和同步索引块(sync block index).CLR利用这些成员管理对象。额外的成员也要计入对象大小。
  2. 从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0
  3. 初始化对象的“类型对象指针”和“同步索引块“成员
  4. 调用类型的实例构造器(构造函数),传递在new中指定的实参
类型转换

CLR重要的就是类型安全,所以不是所有的类型都能进行互相转换,首先说派生类和基类的转换。

提到继承的转换,第一个应该想到的就是里氏转换原则:

子类一定可以转换为父类,而父类不一定能转换成子类

熟悉一个异常InvalidCastException:

internal class Employee

{

……

}

internal class Manager:Employee

{

……

}

public class XXXX()

{

public void main()

{

Manager m =new Manager();

Test(m);

DataTime d=new DataTime ();

Test(d);

}

public void Test(Object o)

{

Employee e =(Employee) o;

}

}

以上,值得注意的是编译器都不会报错,但是实际代码段Test(d)运行时会报InvalidCastException。因为d是一个DateTime类型,自然可以隐式转换为Object,但是它不能转换为Employee,以后看见这个异常,应该觉得很眼熟才对。

然后涉及到is和as运算符的问题:

首先了解一下两个运算符:

is: 判断是否是某一个类型,返回true和false并用永不会抛出异常,但是它并不会将类型进行转换。

as: 尝试将类型进行相应的转换,如果失败返回null,也不会抛出任何异常。

使用方法,不做赘述,那么在进行类型转换操作时:

is: 只能先判断是否能够转换,再进行转换,相当于要运算两次

as:直接进行转换,转换失败则返回类,所以为了避免返回类型报NullReferenceException,对结果做一次非空判断即可,只用运算一次,自然效率高一些。

(CLR-Via-C#) 类型基础的更多相关文章

  1. CLR Via C#: 类型基础

    所有类型都从System.Object派生 一下两个类型定义是完全一致的 class Employee { } class Employee : System.Object { } 由于所有类型最终都 ...

  2. [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

    原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...

  3. NET CLR via C#(第4版)第4章 类型基础

    本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系   本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一 ...

  4. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  5. [Clr via C#读书笔记]Cp4类型基础

    Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...

  6. 重温CLR(三)类型基础

    所有类型都从System.Object派生 “运行时”要求每个类型最终都要从System.Object类型派生.也就是说,一下两个类型的定义完全一致. //隐式派生自Object class Empl ...

  7. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  8. [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1

    引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...

  9. CLR-基元类型以及溢出检查 (CLR-Via-C#) 类型基础

    CLR-基元类型以及溢出检查   =========(CLR via C#阅读笔记)======== 基元类型(primitive type): 基元类型也不做过多的解释,举个例子即可清晰的辨别 在j ...

随机推荐

  1. Matplotlib库的使用

    *可通过dpi修改输出质量 plot函数 第一种方法会使图中所有的字体改变,而第二种方法只会改变中文字体,推荐使用第二种方法.

  2. 【Linux】 用户管理

    Linux用户管理 ■ 查看用户整体情况 cat /etc/passwd可以查看用户的一些基本信息.用finger <user>似乎更加方便 查看某一个特定的用户的话就可以 grep &l ...

  3. 【源码分析】你必须知道的string.IsNullOrEmpty && string.IsNullOrWhiteSpace

    写在前面 之前自信撸码时踩了一次小坑,代码如下: private static void AppServer_NewMessageReceived(WebSocketSession session, ...

  4. RESTful WebService 入门实例

      /* 新建MavenProject,使用以下代码,创建类和POM文件.使用命令行切换到Project根目录,运行mvn package(或者,选中pom.xml 文件右键单击 > run a ...

  5. pyrhon多进程操作初探

    linux系统中提供了fork函数进行进程的创建,这个接口在函数返回上比较特殊,有两个返回值,一个是子进程返回值为0,一个是父进程返回值,值大于0,表是子进程的ID.如果小于0.则表示接口出错. py ...

  6. 小委出发vijos-1572 jdoj-1572

    小委出发 题目大意:一个长度为n的字符串,由()[]{}组成.求最长的和谐字符串:我们对最长和谐字符串的定义就是每一个括号有一个性质相同的括号与之匹配,这两个括号中间要么为空,要么也是和谐的.几个连续 ...

  7. Jquery点击除了指定div元素其他地方,隐藏该div

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script ty ...

  8. C和C++运行库

    一.Windows下动态库 1. 静态函数库 这类库的名字一般是libxxx.lib:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后 ...

  9. Faster R-CNN 的 RPN 是啥子?

     Faster R-CNN,由两个模块组成: 第一个模块是深度全卷积网络 RPN,用于 region proposal; 第二个模块是Fast R-CNN检测器,它使用了RPN产生的region p ...

  10. 吝啬的国度 nyoj

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...