一、什么是基元类型

某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们。例如,可以使用以下语法来分配一个整数:

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#]基元类型的更多相关文章

  1. CLR VIA C#: 基元类型、 引用类型 和 值类型

    一.基元类型 . 引用类型 和 值类型的区别: 1.基元类型(primitive type):编译器直接支持的数据类型: 基元类型 直接映射到 FCL 中存在的类型. C# 小写是基元类型,例如:st ...

  2. CLR:基元类型、引用类型和值类型

    最新更新请访问: http://denghejun.github.io   前言 今天重新看了下关于CLR基元类型的东西,觉得还是有必要将其记录下来,毕竟这是理解CLR成功 之路上的重要一步,希望你也 ...

  3. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  4. 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型

    5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...

  5. 【CLR Via C#】第5章 基元类型、引用类型、值类型

    第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...

  6. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  7. [CLR via C#]5.4 对象哈希码和dynamic基元类型

    原文:[CLR via C#]5.4 对象哈希码和dynamic基元类型 FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处.为此,System.Object提供了虚方 ...

  8. [CLR via C#]5.1 基元类型

    原文:[CLR via C#]5.1 基元类型 某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们.例如可以使用以下语法来分配一个整数: System.Int32 a = ne ...

  9. <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

    5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...

随机推荐

  1. sql server 获取当前日期前三十天的日期

    select convert(varchar(10),dateadd(dd,number,dateadd(month,-1,getdate())),120) as dtfrom master..spt ...

  2. java 用接口计算圆柱的体积和面积并添加颜色

    import java.util.Scanner; class Test { public static void main(String[] args) { fangfa i = new fangf ...

  3. Docker入门系列02

    上篇用一个简单的示例,简单的介绍了 Dockerfile 的配置及其相关的命令.这一篇会在上篇的示例程序里,继续添加新代码及如何将单元测试也放入 Image 建立过程内. 首先,我们需要建一个新的类库 ...

  4. VS2013 执行Enable-Migrations,产生错误的解决办法

    我的错误是:提示文件或资源没有找到”Microsoft.VisualStudio.Shell, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b0 ...

  5. 网络流Edmonds-Karp算法入门

    今天自习课没事干,看书自学了一下网络流中的EK算法.(求最大流) 设s为源点,t为汇点,C为容量矩阵,F为流量矩阵,f为最大流量. 1.初始化F,f 2.用BFS在残量网络中找到一条从s到t的最短增广 ...

  6. 成都Uber优步司机奖励政策(1月12日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. unity3d 角色头顶信息3D&2D遮挡解决方案(一)

    先上效果图,只凭文字描述,脑补应该有些困难- - 如图:有三个角色(我们暂且从左到右叫它们A.B.C),一个2D UI(中间动作选择的框框),一个cube(右边的方块) cube挡住了角色C的头顶信息 ...

  8. VMware 15.0下载及安装教程

    虚拟机 VMware WorkStation Pro15 下载及安装详细解 9虚拟机 VMware WorkStation Pro15 下载及安装详细解. 虚拟机官方网站: https://www.v ...

  9. Codeforces Round #495 (Div. 2) Sonya and Matrix

    正常没有正方形的限制下,值为i的点个数4i 那么从0开始遍历,第一个不为4i的值就是min(x, y) 由于对称性我们姑且令x为这个值 我们先列举n*m=t的各种情况 对于一对n, m.我们已经知道n ...

  10. 垃圾收集器与内存分配策略(深入理解Java虚拟机)

    3.1 概述 垃圾收集器要解决哪些问题? 哪些内存需要回收 什么时候回收 如何回收 引用计数算法:当有一个地方引用,+1,引用失效,-1.     缺点:对象之间相互循环引用的问题. 可达性分析算法: ...