(CLR-Via-C#) 类型基础
CLR要求每个类型最终都派生自System.Object
Object提供的公共方法:
- Equals: 如果两个对象具有相同的值,就返回true
- GetHashCode: 返回对象的哈希码
- ToString:默认返回类型的完整名称(this.GetType().FullName)
- GetType: 返回从type派生的一个实例
object的protected方法:
- MemberwiseClone:这个非虚方法创建类型的新实例,并将新对象的实例字段设与this的字段完全一致
- Finalize:在垃圾回收器判断对象应该作为垃圾回收之后。在对象的内存被实际回收之前,会调用这个虚方法。需要在回收内存钱执行清理工作的类型,应该重写该方法。
所有对象都需要使用new操作符,new的实际操作如下:
- 计算类型及其所有基类型定义的所有实例字段所需要的字节数。堆上哦度需要一些额外的开销成员(overhead成员)包括类型对象指针(type object pointer)和同步索引块(sync block index).CLR利用这些成员管理对象。额外的成员也要计入对象大小。
- 从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0
- 初始化对象的“类型对象指针”和“同步索引块“成员
- 调用类型的实例构造器(构造函数),传递在new中指定的实参
类型转换
CLR重要的就是类型安全,所以不是所有的类型都能进行互相转换,首先说派生类和基类的转换。
提到继承的转换,第一个应该想到的就是里氏转换原则:
子类一定可以转换为父类,而父类不一定能转换成子类
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#) 类型基础的更多相关文章
- CLR Via C#: 类型基础
所有类型都从System.Object派生 一下两个类型定义是完全一致的 class Employee { } class Employee : System.Object { } 由于所有类型最终都 ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- NET CLR via C#(第4版)第4章 类型基础
本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系 本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一 ...
- 类型基础---CLR Via C#笔记一
一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...
- [Clr via C#读书笔记]Cp4类型基础
Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...
- 重温CLR(三)类型基础
所有类型都从System.Object派生 “运行时”要求每个类型最终都要从System.Object类型派生.也就是说,一下两个类型的定义完全一致. //隐式派生自Object class Empl ...
- C#学习笔记——面向对象、面向组件以及类型基础
C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...
- [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...
- CLR-基元类型以及溢出检查 (CLR-Via-C#) 类型基础
CLR-基元类型以及溢出检查 =========(CLR via C#阅读笔记)======== 基元类型(primitive type): 基元类型也不做过多的解释,举个例子即可清晰的辨别 在j ...
随机推荐
- 笔记:Jersey REST 传输格式-JSON
JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Ja ...
- poj-1503-java大数相加
Description One of the first users of BIT's new supercomputer was Chip Diller. He extended his explo ...
- 线程池的submit和execute方法区别
线程池中的execute方法大家都不陌生,即开启线程执行池中的任务.还有一个方法submit也可以做到,它的功能是提交指定的任务去执行并且返回Future对象,即执行的结果.下面简要介绍一下两者的三个 ...
- C++模板入门教程(一)——模板概念与基本语法
转载请保留以下声明 作者:赵宗晟 出处:http://www.cnblogs.com/zhao-zongsheng/ 前言 有些人提到C++模板就会下意识地觉得可怕.看不懂.避而远之.其实模板并不复杂 ...
- Algorithm --> 求1到n的和
求1到n的和 输入n,求和1到n,要求不能使用乘除法,不使用任何if while for 以及三目运算,怎么做? 版本一 static int f(int n) { n && (n + ...
- 程序员的入门 简单的编程HelloWord
那么在上一章章节 http://www.cnblogs.com/Goraidh/p/8674329.html 我们简单的俩了解了一下什么是java和配置编写java的环境,本章呢我们学习如何编写一个简 ...
- Linux下ping,telnet,ssh命令的比较
ping工作在OSI模型的第三层,网络层. 主要用于测试到达目的主机的网络是否连接,不能检测某个端口是否开放. ping使用ICMP协议,不使用某个特定端口. 也可以 ping 域名 ,这样可以直接看 ...
- CSS服务器字体
1,首先要下载ttf文件 推荐下载网站: https://www.dafont.com/ 2,写css样式 3,服务器字体 font-family:自己随便取个名字就行 注意url里的ttf文件和f ...
- 配置tomcat8数据源(采用局部数据源方式)
tomcat提供两种数据源配置方式,全局和局部.全局的话对于所有web应用都生效,局部只对于配置的某一个web生效. 步骤: 1.将mysql的jdbc驱动复制到tomcat的lib路径下. 2.在t ...
- Beta No.3
今天遇到的困难: 组员对github极度的不适应 github的版本控制和协同化编程确实操作起来需要一定的熟练度,我们缺乏这种熟练度 Android Studio版本不一致项目难以打开的问题仍然无法解 ...