一、什么是基元类型

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

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. python学习——复习

    一.基础知识: 1.文件操作有哪些模式?请简述各模式的作用. 'r' 读模式,相应的方法有 read(),readline(),readlines() 'w' 写模式,相应的方法有 write(),w ...

  2. SpringBoot-07:SpringBoot整合PageHelper做多条件分页查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述如何在SpringBoot中整合PageHelper,如何实现带多个条件,以及PageInfo中的 ...

  3. Ruby & Rails学习资料

    ------------------教程------------- Ruby风格指南(代码规范) https://github.com/bbatsov/ruby-style-guide 笨方法學 Ru ...

  4. 基于Kafka的服务端用户行为日志采集

    本文来自网易云社区 作者:李勇 背景 随着互联网的不断发展,用户所产生的行为数据被越来越多的网站重视,那么什么是用户行为呢?所谓的用户行为主要由五种元素组成:时间.地点.人物.行为.行为对应的内容.为 ...

  5. SpringBoot入门(五)——自定义配置

    本文来自网易云社区 大部分比萨店也提供某种形式的自动配置.你可以点荤比萨.素比萨.香辣意大利比萨,或者是自动配置比萨中的极品--至尊比萨.在下单时,你并没有指定具体的辅料,你所点的比萨种类决定了所用的 ...

  6. cf#516B. Equations of Mathematical Magic(二进制,位运算)

    https://blog.csdn.net/zfq17796515982/article/details/83051495 题意:解方程:a-(a^x)-x=0 给出a的值,要求计算解(非负)的个数 ...

  7. Mac环境下RabbitMq安装与测试教程

    RabbitMq安装与测试教程 Installing on Mac I. 安装 123456789 brew install rabbitmq ## 进入安装目录cd /usr/local/Cella ...

  8. MySQL☞自连接

    自连接:一张表中根据自身列之间的关联关系,自己跟自己链接. A.创建一个user表,且插入数据,数据如下: B.分析: 把user表看成两张表,一张员工表,一张领导表,发现员工表中lead(领导编号) ...

  9. leetcode-最长无重复字符的子串

    参考他的人代码:https://blog.csdn.net/littlebai07/article/details/79100081 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: ...

  10. 数据库Mysql的学习(七)-自定义函数和流程控制

    DELIMITER // (设置结束符 其实我也不太明白为啥要这样 记住就行把) CREATE FUNCTION ym_date(mydate DATE) (创建函数 函数名字(参数)) ) (指定函 ...