注:以下笔记全摘录自CLR via C# 3

1、所有类型都从System.Object派生:”运行时“要求每个类型最终都从System.Object派生。

2、System.Object提供了四个公共实例方法:

(1) Equals :如果两个对象具有相同的值,就返回true。

(2) GetHashCode

(3) ToString:该方法默认返回类型的完整名称(this.GetType().FullName)。然而,我们经常重写这个方法,使它返回一个String对象,其中包含对象状态的一个表示。例如,核心类型(比如Boolean和Int32)重写了这个方法,返回他们值的一个字符串表示。

(4) GetType:返回Type派生的一个对象的实例,指出调用GetType的那个对象是什么类型。返回的Type对象可以和反射类配合使用,从而获取与对象的类型有关的元数据信息。

3、System.Object的受保护方法:

(1) MemberwiseClone:这个非虚方法能创建一个类型的新实例,并将新对象的实例字段设与this对象的实例字段完全一致。返回的是对新实例的一个引用。

(2) Finalize:在垃圾回收器判断对象应该被作为垃圾回收之后,在对象的内存被实际回收之前,会调用这个虚方法。

4、CLR要求所有对象都用new操作符来创建。以下是new操作符所做的事情。

(1) 它计算类型及其所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中所有字段需要的字节数。堆上每个对象都需要一些额外成员,”类型对象指针“(type object pointer)和“同步块索引”(sync block index)。这些成员由CLR用于管理对象。这些额外成员的字节数会计入对象大小。

(2)它从托管堆中分配指定类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零(0)。

(3)它初始化对象的”类型对象指针“和”同步块索引“成员。、

(4)调用类型的实例构造器,向其传入在对new的调用中指定的任何实参。

5、顺便说一句,没有和new操作符对应的delete操作符;换言之,没有办法显示释放为一个对象分配的内存。

6、CLR最重要的特性之一就是类型安全性。(其它的重要特性呢?)

7、使用C#  的is 和as操作符来转型。

(1)is :用于检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或false。注意:is操作符永远不会抛出异常。如果引用对象是null,is操作符总是返回false,因为没有可检查其类型的对象。

is操作符通常像下面这样使用(放到if判断里面

if( o is Employee){

Employee e=(Employee ) o;

//在剩下的代码用e

}

这段代码,CLR会检查两次对象的类型;is 操作符首先核实o是否兼容于一个Employee类型。如果是,那么在if语句内部执行时,CLR再次核实o是否引用一个Employee。(类型检查增加了安全性,但是有性能损失)

(2)as:简化is的写法,同时提升性能(只校验一次)。as的工作方式和强制类型转换一样,只是它永远不会抛出异常,如果对象不能转型,结果就为null。所以,正确的做法是检查最终生成的引用是否为null。如果企图直接使用最终生成的引用,会抛出一个System.NullReferenceException异常,以下代码对此进行了演示:

 Object o = new Object();    //新建一个Object对象
Employee e = o as Employee; // 将o转型为一个Employee
//上述操作会失败,不会抛出异常,但e会被设为null
e.ToString(); //访问e会抛出一个NullReferenceException异常

8、命名空间和程序集

命名空间(namespace)用于对相关的类型进行逻辑性分组,开发人员使用命名空间方便的定位一个类型。

在C#中,namespace的作用只是告诉编译器为源代码中出现的每个类型名称附加空间名称前缀,减少程序员的打字量。

命名空间和程序集的关系:

注意,命名空间和程序集不一定是相关的。特别是,同一个命名空间中各个类型可能是在不同程序集中实现的。例如,System.IO.FileStream类型是在MSCorLib.dll程序集中实现的,儿System.IO.FileSystemWatch类型是在System.dll程序集中实现的。

在一个程序集中,也可能包含不同命名空间中的类型。例如,System.Int32和System.Text.StringBuilder类型都在MSCorbLic.dll中。

C#基础巩固之基础类型的更多相关文章

  1. Javascript基础回顾 之(一) 类型

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  2. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  3. C#_02.12_基础二_.NET类型存储和变量

    C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...

  4. Java基础教程:枚举类型

    Java基础教程:枚举类型 枚举类型 枚举是将一具有类似特性的值归纳在一起的方法.比如,我们可以将周一到周日设计为一个枚举类型.彩虹的七种颜色设计为一个枚举类型. 常量实现枚举 我们通过定义常量的方式 ...

  5. Python基础之Python语言类型

    编程语言主要从以下几个角度进行分类: 编译型和解释型 静态语言和动态语言 强类型定义语言和弱类型定义语言 编译和解释的区别是什么? 编译器把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样 ...

  6. GO语言基础(结构+语法+类型+变量)

    GO语言基础(结构+语法+类型+变量) Go语言结构 Go语言语法 Go语言类型 Go语言变量       Go 语言结构 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 &a ...

  7. MYSQL、PHP基础、面向对象基础简单复习总结

    一.MYSQL         1.配置MySql                 第一步安装服务器(apache).                 第二部安装MySql界面程序         2 ...

  8. Jmeter基础之---jmeter基础概念

    Jmeter基础之---jmeter基础概念 JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. JMeter 介绍: 一个非常优 ...

  9. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  10. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

随机推荐

  1. MAC上截图,编辑图片与恢复图片

    1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+4:鼠标选定区域截图,保存截图到桌面 3.Command+shift+4+Space(空格键):程序窗口截 ...

  2. 使用rvm安装与切换Ruby

    列出已知的 Ruby 版本 rvm list known安装一个 Ruby 版本 rvm install 2.3.1 --disable-binary这里安装了最新的 2.2.0, rvm list ...

  3. springcloud 服务调用的两种方式

    spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign.Ribbon是一个基于HTTP和TCP客户端的负载均衡器,其实feign也使用了rib ...

  4. 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格

    在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...

  5. docker 系列 - 容器数据持久化和数据共享

    docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver. stroage driver主要是存储那些无状 ...

  6. windows10 下使用Pycharm2016 基于Anaconda3 Python3.6 安装Mysql驱动总结

    本文记录:在PyCharm2016.3.3 中基于Anaconda3 Python3.6版本安装Python for Mysql驱动.尝试了安装Mysql-Connector成功,但是连接数据库时驱动 ...

  7. MySQL Connector 编程

    MySQL Connector 是MySQL数据库客户端编程的接口, 它提供了通过网络访问数据库的接口, 这些功能在动态链接库(.dll, .so)或者静态对象库(.lib, .a)中实现. 使用时必 ...

  8. JS中var、let、const区别? 用3句话概括

    使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象: 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升: 使用const声明的是常量,在后面出现的代码中不能再修 ...

  9. file图片上传之前先预览

    链接:https://www.cnblogs.com/tandaxia/p/5125275.html 记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<inp ...

  10. namecheap域名设置Cloudflare为第三方DNS

    待更……等我搞完了就来写总结