[CLR via C#]基元类型
一、什么是基元类型
某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们。例如,可以使用以下语法来分配一个整数:
System.Int32 a = new System.Int32();
但你肯定不愿意使用这种语法来声明并初始化一个整数,因为实在是太繁琐了。幸运的是,包括C#在内的许多编译器都允许换用如下所示的语法:
int a = 0;
这种语法不仅增加了代码的可读性,而且生成的IL代码与使用System.Int32时生成的IL代码是完全一样的。这种编译器直接支持的数据类型称为基元类型(primitive type)。基元类型直接映射到Framewok类库中存在的类型。
基本类型还有写成文本常量,文本常量可被看成是类型本身的一个实例,所以可以像下面为一个实例(123)调用实例方法:
Console.WriteLine(123.ToString());
此外,如果一个表达式由文本常量构成,编译器能在代码编译时完成对表达式的求值,从而增强应用程序的性能:
Int32 x = 100 + 20; //编译生成的代码将x设为120
二、C#有哪些基元类型
| C#基元类型 | FCL类型 | CLC相容 | 说明 |
| sbyte | System.SByte | 否 | 有符号8位数 |
| byte | System.Byte | 是 | 无符号8位数 |
| short | System.Int16 | 是 | 有符号16位数 |
| ushort | System.UInt16 | 否 | 无符号16位数 |
| int | System.Int32 | 是 | 有符号32位数 |
| uint | System.UInt32 | 否 | 无符号32位数 |
| long | System.Int64 | 是 | 有符号64位数 |
| ulong | System.UInt64 | 否 | 无符号64位数 |
| char | System.Char | 是 | 16位Unicode字符,占2个字节长度 |
| float | System.Single | 是 | IEEE32位浮点值 |
| double | System.Double | 是 | IEEE64位浮点值 |
| bool | System.Boolean | 是 | 一个true/false值 |
| decimal | System.Decimal | 是 | 一个128位高精度浮点数 |
| string | System.String | 是 | 一个字符数组 |
| object | System.Object | 是 | 所有类型的基类型 |
| dynamic | System.Object | 是 | 对于CLR,dynamic和object是完全一致的。 |
三、类型之间的转换
Int32 i = 5;
Int64 l = i;
只有在转换"安全"的时候,C#才允许隐式转换。所谓"安全",是指不会发生数据丢失的情况。比如从Int32转换为Int64。然而,如果一次转换有可能是不安全的,C#就要求进行显式转换。需要注意的是,不同的编译器可能生成不同的代码来处理转型操作。例如,将值为6.8的一个Single转型为一个Int32时,有的编译器可能生成代码,对其进行截断处理,最终将6放到Int32中,有的编译器可能将结果向上取整为7.C#总是对结果进行截断处理,而不进行向上取整。
对基元类型执行的许多算术运算都有可能造成溢出:
Byte b = 100;
b = (Byte)(b + 200);
在大多数编程情形中,这种悄然发生的溢出是我们不希望的,如果没有检测到这种溢出,会导致应用程序行为失常。CLR提供了一些特殊的IL指令,允许编译器选择它认为最恰当的行为。CLR有一个add指令,作用是将两个值加到一起,但不执行溢出检查,CLR还有一个add.ovf指令,作用也是将两个值加到一起,但会在发生溢出时抛出OverflowException异常。除了用于加法运算的这两个IL指令,CLR还有其他运算提供了类似的功能。
C#允许程序员自己决定如何处理溢出,溢出检查默认是关闭的。也就是说,编译器在生成IL代码时,会自动使用四则运算不含溢出检查的版本。这样的结果是代码能够更快的运行。但是,开发人员必须保证不会发生溢出,或者他们的代码能预见到这些溢出。让C#编译器控制溢出的一个办法是使用/checked+编译器开关,在Visual Studio中更改Checked设置,请打开项目的属性对话框,选择"生成"选项卡,单击"高级",再勾选"检查运算上溢/下溢"。除了上面这种全局性的打开或关闭溢出检查,程序员还可在代码的特定区域灵活的控制溢出检查。C#通过提供的checked/unchecked操作符来实现这种灵活性。
Byte b = 100;
b = checked((Byte)(b + 200));
除了checked/unchecked操作符,C#还支持checked/unchecked语句,它们造成块中的所有表达式都进行或不进行溢出检查。
[CLR via C#]基元类型的更多相关文章
- CLR VIA C#: 基元类型、 引用类型 和 值类型
一.基元类型 . 引用类型 和 值类型的区别: 1.基元类型(primitive type):编译器直接支持的数据类型: 基元类型 直接映射到 FCL 中存在的类型. C# 小写是基元类型,例如:st ...
- CLR:基元类型、引用类型和值类型
最新更新请访问: http://denghejun.github.io 前言 今天重新看了下关于CLR基元类型的东西,觉得还是有必要将其记录下来,毕竟这是理解CLR成功 之路上的重要一步,希望你也 ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- [CLR via C#]5.4 对象哈希码和dynamic基元类型
原文:[CLR via C#]5.4 对象哈希码和dynamic基元类型 FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处.为此,System.Object提供了虚方 ...
- [CLR via C#]5.1 基元类型
原文:[CLR via C#]5.1 基元类型 某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们.例如可以使用以下语法来分配一个整数: System.Int32 a = ne ...
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
随机推荐
- FPGA基础知识,应用,ASIC、ASSP区别(四)
一.ASIC与ASSP区别? 专用应用集成电路( ASIC) 是一种由电子组件组成的集成电路,例如 :晶体管.电容器.电阻器等,这些组件被植入到晶元上 :晶元由硅或其他半导体材料组成,并可按照特定用途 ...
- FPGA算法学习(1) -- Cordic(Verilog实现)
上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分析和实现,但是所用到的变量依然是浮点型,而cordic真正的用处是基于FPGA等只能处理定点的平台.只 ...
- window下创建虚拟环境
一. windows下创建虚拟环境 1. 终端下执行命令:python -m pip install -upgrade pip 2. pip install virtualenv 3. 在本地创建一个 ...
- springboot+websocket+sockjs进行消息推送【基于STOMP协议】
springboot+websocket+sockjs进行消息推送[基于STOMP协议] WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就 ...
- cakephp中find('list')的使用
运用一.快速实现下拉菜单 控制器中,使用find('list')返回的是键值对的数组,键名是array的第一个参数id,键值就是第二个参数content. public function list_s ...
- JavaSE基础笔记
JVM 不是跨平台的,他是用 C++编写的. Path 环境变量的地址是 ...jdk/bin java_home 地址是 ...jdk
- iReport jasperReports 生成表格
使用iReport生成表格 一 环境:iReport-5.6.0 JDK7 1.注意,iReport的最新版本目前还不支持JDK8,如果项目工程已经配置了JDK8,那也不用去修改环境变量和工程的 ...
- Vue框架核心之数据劫持
本文来自网易云社区. 前瞻 当前前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Angular.Regular.Vue.React等等,它们最大的优点就是可以实现数据绑定,再也不需 ...
- (译)学习如何构建自动化、跨浏览器的JavaScript单元测试
作者:Philip Walton 译者:Yeaseon 原文链接:点此查看 译文仅供个人学习,不用于任何形式商业目的,转载请注明原作者.文章来源.翻译作者及链接,版权归原文作者所有. ___ 我们都知 ...
- 问题:MongoDB C# driver异常:Truncation resulted in data loss
问题描述: 原因分析: MongoDB C#驱动在读取数据记录遇到数值类型字段时,如果没有设置允许截断,将抛出TruncationException. 解决方法: [BsonRepresentatio ...