[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操作符/语句 ...
随机推荐
- nodejs显现events.js:72抛出错误
随着人们开始学习,我用nodejs过程中遇到如下列错误执行: events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EAD ...
- HDU 4864Task(更多的联合培训学校1)(贪婪)
职务地址:pid=4864">HDU4864 这题又是一上来觉得是最小费用流,可是边太多.果然,敲完交上去后不断TLE.. 小优化了两次也没过. . . sad.. 后来看了题解才发现 ...
- 解决无法切换到jenkins用户的问题
su - jenkins一直有效,今天在centos发现无效,原因是 /etc/password文件里的/bin/bash被yum安装的时候变成了/bin/false. 改动后就能够了. ubuntu ...
- BZOJ 1096 ZJOI2007 仓库建设 边坡优化
标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...
- RH253读书笔记(2)-Lab 2 System Resource Access Controls
Lab 2 System Resource Access Controls Goal: To become familiar with system resource access controls. ...
- ASP.NET开发规范:OWIN
ASP.NET开发规范:OWIN 今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 ...
- 大虾翻译(一):jQuery.extend()
本文是在JavaScript之三里面链接内容的中文翻译.我会尽可能做到信达雅且保持作者原意不变,OK,let's Go! jQuery.extend(target,[object1],[objectN ...
- mvc与My97DatePicker插件的结合
Razor视图引擎与My97DatePicker插件的结合 1 using System; 2 using System.Collections.Generic; 3 using System.Run ...
- PKU 1509 Glass Beads (最小表示法)
题意:有一个环形字符串,让你找一个位置切一刀使得字符串字母序最小.输出这个位置. 思路:能够看成两个字符串比較.一个是从下标0開始(0~n-1),一个从下标1開始(1~n-1,0). 然后两个指针i= ...
- SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
大家都知道SAP HANA项目打包成Delivery Unit(缩写为DU).依照"官方"的开发模式,特别是整个团队仅仅使用一个HANA Instance进行项目开发,因为HANA ...