一、什么是基元类型

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

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. 解决sublime 的 package control 问题here are no packages available for installation

    参考https://blog.csdn.net/zknxx/article/details/52685094 关于 channel_v3.json 文件 ,下载的压缩包里没有, 需要下载https:/ ...

  2. C++远征离港篇-学习笔记

    C++远征离港篇 离港总动员 C++远征计划的学习者肯定是冲着封装,继承,多态来的. 知识点: 指针 VS 引用 #define VS const(更强数据控制力) 函数默认值 & 函数重载 ...

  3. Lingo解决最优化问题

    目录 Lingo解决优化问题 前言 一.优化模型介绍 二.运输问题 2.1 问题描述 2.2 问题分析 2.2 优化模型构建 2.3 模型求解 2.4 求解结果 三.待更新 Lingo解决优化问题 @ ...

  4. 青岛Uber优步司机奖励政策(9月14日~9月20日)

    由于上周银行系统升级,工资延后 9/14-9/20奖励细则 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不 ...

  5. 青岛Uber司机奖励政策(8月31号~9月6号)

    本周的奖励规则如下,请各位司机朋友按照自己的情况查询. 人民优步(People’s Uber) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版 ...

  6. SpringBoot学习:整合Redis

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 pom.xml添加对redis的依赖: <!-- https://mvnrepos ...

  7. pygame安装【在pycharm的IDE project下】

    pygame安装[在pycharm的IDE project下] 首先更新电脑的pip.exe[命令行下面] 然后进入IDE project ——>setting 中查找是否安装pygame 我的 ...

  8. 巧用浏览器F12调试器定位系统前后端bug

    做测试的小伙伴可能用过httpwatch,firebug,fiddler,charles等抓包(数据包)工具,但实际上除了这些还有一个简单实用并的抓包工具,那就是浏览器的F12调试器. httpwat ...

  9. Java开发工程师(Web方向) - 04.Spring框架 - 第1章.Spring概述

    第1章.Spring概述 Spring概述 The Spring Framework is a lightweight solution and a potential one-stop-shop f ...

  10. 165. Merge Two Sorted Lists【LintCode by java】

    Description Merge two sorted (ascending) linked lists and return it as a new sorted list. The new so ...