[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操作符/语句 ...
随机推荐
- sql server 获取当前日期前三十天的日期
select convert(varchar(10),dateadd(dd,number,dateadd(month,-1,getdate())),120) as dtfrom master..spt ...
- java 用接口计算圆柱的体积和面积并添加颜色
import java.util.Scanner; class Test { public static void main(String[] args) { fangfa i = new fangf ...
- Docker入门系列02
上篇用一个简单的示例,简单的介绍了 Dockerfile 的配置及其相关的命令.这一篇会在上篇的示例程序里,继续添加新代码及如何将单元测试也放入 Image 建立过程内. 首先,我们需要建一个新的类库 ...
- VS2013 执行Enable-Migrations,产生错误的解决办法
我的错误是:提示文件或资源没有找到”Microsoft.VisualStudio.Shell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b0 ...
- 网络流Edmonds-Karp算法入门
今天自习课没事干,看书自学了一下网络流中的EK算法.(求最大流) 设s为源点,t为汇点,C为容量矩阵,F为流量矩阵,f为最大流量. 1.初始化F,f 2.用BFS在残量网络中找到一条从s到t的最短增广 ...
- 成都Uber优步司机奖励政策(1月12日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- unity3d 角色头顶信息3D&2D遮挡解决方案(一)
先上效果图,只凭文字描述,脑补应该有些困难- - 如图:有三个角色(我们暂且从左到右叫它们A.B.C),一个2D UI(中间动作选择的框框),一个cube(右边的方块) cube挡住了角色C的头顶信息 ...
- VMware 15.0下载及安装教程
虚拟机 VMware WorkStation Pro15 下载及安装详细解 9虚拟机 VMware WorkStation Pro15 下载及安装详细解. 虚拟机官方网站: https://www.v ...
- Codeforces Round #495 (Div. 2) Sonya and Matrix
正常没有正方形的限制下,值为i的点个数4i 那么从0开始遍历,第一个不为4i的值就是min(x, y) 由于对称性我们姑且令x为这个值 我们先列举n*m=t的各种情况 对于一对n, m.我们已经知道n ...
- 垃圾收集器与内存分配策略(深入理解Java虚拟机)
3.1 概述 垃圾收集器要解决哪些问题? 哪些内存需要回收 什么时候回收 如何回收 引用计数算法:当有一个地方引用,+1,引用失效,-1. 缺点:对象之间相互循环引用的问题. 可达性分析算法: ...