数据类型系统是一门编程语言的核心。.NET系列的语言使用统一的数据类型系统CTS(Common Type System)。所有的数据类型都继承自System.Object。

一 值类型和引用类型

a)面向对象语言最明显的特征便是:万物皆对象。但早期的面向对象语言却因为这一点存在性能上的问题。因为任何变量都要在堆上分配。CTS通过将数据类型分为值类型和引用类型解决了这个问题。

b) 值类型

值类型包括基元类型(Primitive Type,包括int,double,byte等)、枚举和结构体;这些类型的变量会保存在栈(stack)上;不能为空;操作数据时,直接操作栈上的值。

c)引用类型

引用类型包括类、数组、委托、接口;这类数据会保存在堆(Heap)上;可以为空;引用类型实际上是类型安全的指针,类型安全意味着指针一定会指向堆上已经存在的对象,操作数据时,操作的是该指针。


二 装箱和拆箱

装箱和拆箱在保证“万物皆对象”的前提下,做到了对性能的提升。

a) 装箱就是将一个值类型的变量转换为引用类型;拆箱则反之。这一概念最重要的地方在于:“它使一个事物只有在需要是对象的时候才作为对象”。比如一个Int32类型的变量,保存在栈上,但它可以传递给任何从Sytem.Object衍生的对象,而实际上它只是一个保存在栈上、占用了4个字节的值。

b) 值类型有很多种,但引用类型可以认为只有System.Object一种,所以装箱的时候,值类型的转换目标是明确的,在将值类型赋值给引用类型时会自动进行装箱。但拆箱时,需要人为指定要将引用类型转换为哪种值类型。


三 System.Object

System.Object是所有对象的基类,所有对象都默认继承了System.Object类的方法。System.Object类具有如下几个方法:

public方法:

Equals:比较变量是否相等,如果两个变量引用同一个对象,这两个变量相等;对于值类型来说,如果类型和值都相等,则认为变量相等。

GetHashCode:计算对象的哈希值时用。

GetType:反射时,用来取得对象的类型。

ToString:默认返回对象的名称。

ReferenceEquals:本书比较早,这个属性应该是后来版本的.NET中添加的,用于比较是否引用同一个对象。

protected方法:

Finalize:GC进行垃圾回收时用到。

MemberwiseClone:用于进行浅拷贝。

四 CTS类型与C#类型的对应


五 类型转换

根据里氏转换原则,可以使用派生类来替换基类。如果假设基类为Employee,派生类为ContractEmployee:

a) 向上转换(upcast) 将派生类赋值给基类时进行向上转换,这种转换可自动进行(隐式转换)。

Employee e=new ContractEmployee();

b) 向下转换(downcast) 将基类转换为派生类时进行的是向下转换,需要显式转换。

这样的写法编译可以通过。只有在运行时才可以确认转换是否能够成功,如果转换失败,会抛出System.InvalidCastException异常。

另外,还可以使用as关键字进行转换,使用这种方式就行向下转换时,运行时转换失败不会报错,会赋空值,所以要注意做好非空判断。

《Inside C#》笔记(三) 数据类型的更多相关文章

  1. Java学习笔记三——数据类型

    前言 Java是强类型(strongly typed)语言,强类型包含两方面的含义: 所有的变量必须先声明后使用: 指定类型的变量只能接受预支匹配的值. 这意味着每一个变量和表达式都有一个在编译时就确 ...

  2. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  3. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  4. 构建高性能WEB站点笔记三

    构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...

  5. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  6. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

  8. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  9. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

随机推荐

  1. Swift5 语言指南(十三) 方法

    方法是与特定类型相关联的函数.类,结构和枚举都可以定义实例方法,这些方法封装了用于处理给定类型的实例的特定任务和功能.类,结构和枚举也可以定义类型方法,它们与类型本身相关联.类型方法类似于Object ...

  2. php cli模式和浏览器访问下加载php.ini文件的注意事项[架构篇]

    使用wampserver或Xampp时,会将配置文件放在一个统一的目录中去调用,这时如果都使用浏览器访问,自然是没有问题的,但是如果换成cli命令行模式运行,则会出现加载了的扩展无法使用的问题. 案例 ...

  3. HttpClient 传输文件的两种方式

    1. org.apache.commons.httpclient.HttpClient 1.1 pom <dependency> <groupId>org.apache.htt ...

  4. Java 动态生成 PDF 文件

    每片文章前来首小诗:   今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天.  --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...

  5. Django使用Channels实现WebSocket--上篇

    WebSocket - 开启通往新世界的大门 WebSocket是什么? WebSocket是一种在单个TCP连接上进行全双工通讯的协议.WebSocket允许服务端主动向客户端推送数据.在WebSo ...

  6. 1-监控界面sql保存

    1, BufferSize_machine 1), template 主要用来监控buffersize的状态的 name: 模块名字, 用于后续调取使用, label: 模块显示名字, 在页面显示的 ...

  7. 深入学习Python解析并解密PDF文件内容的方法

    前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...

  8. Postman接口测试_添加断言

    1.设置环境变量 postman.setEnvironmentVariable("key", "value");  例子: postman.setEnviron ...

  9. Linux中ansible批量管理软件部署及剧本编写

    服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...

  10. Linux中重命名乱码文件

    Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...