[CLR via C#]5.1 基元类型
某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们。例如可以使用以下语法来分配一个整数:
System.Int32 a = new System.Int32();
当然,你肯定不愿意使用这种语法,C#允许使用如下所示的语法:
int a = 0;
这种语法不仅增强代码的可读性,而且生成的IL代码和是有System.Int32时生成的IL代码是完全一致的。
int a = 0;
System.Int32 a =0;
int a = new int();
System.Int32 a = new System.Inte32();
下表列出了FCL类型在C#中对应的基元类型:
| C#基元类型 | FCL类型 | CLS相容 | 说明 |
| sbyte | System.SByte | NO | 有符号8位值 |
| byte | System.Byte | YES | 无符号8位值 |
| short | System.Int16 | YES | 有符号16位值 |
| ushort | System.UInt16 | NO | 无符号16位值 |
| int | System.Int32 | YES | 有符号32位值 |
| uint | System.UInt32 | NO | 无符号32位值 |
| long | System.Int64 | YES | 有符号64位值 |
| ulong | System.UInt64 | NO | 无符号64位值 |
| char | System.Char | YES | 16位Unicode字符 |
| float | System.Single | YES | IEEE32位浮点值 |
| double | System.Double | YES | IEEE64位浮点值 |
| bool | System.Boolean | YES | 一个true/false值 |
| decimal | System.Decimal | YES | 一个128位高精度浮点值,常用于不容许舍入误差的金融计算 |
| string | System.String | YES | 一个字符数组 |
| object | System.Object | YES | 所有类型的基类型 |
| dynamic | System.Object | YES | 对于CLR,dynamic和object完全一致。然而,C#编译器允许使用一个简单的语法,让dynamic变量参与动态调度 |
可以想象C#编译器自动假定在所有的源代码文件中添加了以下using指令:
using sbyte = System.Sbyte;
using byte = System.Byte;
using int = System.Int32;
using uint = System.UInt32;
......
C#语言规范上说:"从风格上上,最好使用关键字,而不是使用完整的系统类型名称"。但本书作者并不同意这种说法,以下是他的一些理由:
1)很多开发人员困惑于应该使用string还是String。由于C#的string(关键字)是直接映射到System.String(一个FCL类型),所以两者是没有区别的。还有开发人员认为,在32位系统中int是32位整数,在64位系统中就变成64位整数了,事实并不是这样。在C#中,int始终映射到System.Inte32,所有不管什么系统,int都是32位整数,如果都使用Int32就不会产生这种误解。
2)在C#中,long映射到System.Int64,当在其他编程语言中,long可能映射到的是Int16或Int32。这样在看别的编程语言时容易产生误解。
3)FCL的许多方法都将类型名称作为方法名的一部分。
BinaryReader br =new BinaryReader(...);
float val = br.ReadSingle(); //正确,当看上去不自然
Single val = br.ReadSingle(); //正确,看上去一目了然
unchecked:
UInt32 invalid = unchecked((UInt32)(-1)); //OK
checked:
Byte b = 100;
b = checked((Byte)(n+200)); //抛出溢出异常
C#还提供checked和unchecked语句
checked{
Byte b = 100;
b = checked((Byte)(n+200));
}
在Visaul Studio的"高级生成设置"对话框中可以指定编译器是否检查溢出。
System.Decimal类型是一个非常特殊的类型。虽然C#将Decimal视为一个基元类型,但CLR则不然,也就是说CLR没有相应的IL指令来决定如何处理Decimal值。Decimal值得处理速度是要慢于其他CLR基元类型的值得处理速度。还有对Decimal来说,checked和uncheked操作符、语句和编译器都是无效的,Decimal溢出时是一定会抛出异常的。
[CLR via C#]5.1 基元类型的更多相关文章
- CLR via #C读书笔记三:基元类型、引用类型和值类型
1.一些开发人员说应用程序在32位操作系统上运行,int代表32位整数:在64位操作系统上运行,int代表64位整数.这个说法是完全错误的.C#的int始终映射到System.Int32,所以不管在什 ...
- [Clr via C#读书笔记]Cp5基元类型引用类型值类型
Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...
- 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提供了虚方 ...
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
随机推荐
- Windows 8实例教程系列 - 数据绑定高级实例
原文:Windows 8实例教程系列 - 数据绑定高级实例 上篇Windows 8实例教程系列 - 数据绑定基础实例中,介绍Windows 8应用开发数据绑定基础,其中包括一些简单的数据绑定控件的使用 ...
- Tomcat—怎样在Tomcat Webserver下部署Web项目
总结一下怎样在Tomcat Webserver下部署Web项目:
- 策略模式Strategy——坐什么车回家?
1.存在的问题和模型 :2014年6月 学校:廊坊师范 家:石家庄 人物:学生 又快到期末考试了.回家的节奏也奔上日程,无聊之余就想想这次回家的事儿. 对我来说回 ...
- Cocos2d-x3.2游戏的核心循环在Application,怎样处理FPS不稳
今天天气非常阴,立即要下雨了,陈吃早点功夫写点东西, 一场秋雨一场寒,十场秋雨要穿棉,各位从今往后多穿点 int Application::run() { if(!applicationDidFini ...
- 讲座:html5于canvas疯狂的炮轰实现
<html> <head> <title>坎农</title> <script src="../js/jscex.jscexRequir ...
- 跨域 Iframe 通信解决方案(兼容 IE 系列浏览器。)
实现思路: 1.postMessage(IE8+, Firefox 3.1+, Opera 9+, Safari, and Chrome) 2.利用window.navigator共享信息,使支持IE ...
- Unity3D Resources TextAsset 正文
一些小的数据,您可以使用txt文字作为一种媒介,被收购.变速箱.更改.记忆力. 实例:User1.2.3.txt,放入 Resources/Data 文件下: 一,Unity3d Resources. ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- Team Foundation Server 2015使用教程--默认团队checkin权限修改
- 端口扫描之王——nmap入门精讲(转)
端口扫描在百度百科上的定义是: 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利 ...