【深入.NET平台】浅谈.NET Framework基元类型
什么是基元类型?
初学者可能很少听说过这个名词,但是平时用得最多的肯定是基元类型。先看下面两行代码:
System.Int32 a = ; ;
上面两行代码都表示声明一个int类型的变量,但在平时写代码的时候我们一般用的是第二种方式。第二种方式不仅简洁、易读,而且生成的IL代码和第一种完全一致。像这种编译器直接支持的数据类型就称为基元类型。类似的还有double、bool、long、string等。
基元类型与.NET框架类库的关系
在我接触的第一份面试题中,我记得有这么一道题目:请谈谈C#中string和String的区别?
我当时确实懵逼了,有区别吗?好像用的时候完全没有区别。其实二者说有区别也可以,说没区别也没错。因为基元类型sting直接映射到FCL中的String类型。所以本质上他俩是同一个东西。
在C#中,基元类型都直接映射到.NET框架类库中存在的类型。之前看了一本书,关于这种映射有一种解释:
using string = System.String;
从这个角度可以认为,C#编译器假定所有源文件都添加了using指令。
下面列举C#基元类型在FCL中对应的类型:
| C#基元类型 | FCL类型 | 符合CLS | 说明 |
| 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字符 |
| float | System.Single | 是 | 32位浮点数 |
| double | System.Double | 是 | 64位浮点数 |
| bool | System.Boolean | 是 | true/false值 |
| string | System.String | 是 | 字符数组 |
| object | System.Object | 是 | 所有类型的基类型 |
FCL中只要符合公共语言规范(CLS)的类型,其他语言都提供了类似的基元类型,但是不符合CLS的类型,其他语言就不一定支持了。
基元类型的使用
C#编译器支持与类型转换、字面值以及操作符有关的模式。
首先,编译器能执行基元类型之间的隐式或显示转换,例如:
; //从Int32隐式转换为Int32 long b = a; //从Int32隐式转换为Int64 byte d = (byte)a; //从Int32显示转换为Byte short e = (short)a; //从Int32显示转换为Int16
System.Int64与System.Int32是不同的类型,而且不存在派生关系。那么他们之间为什么能隐式转换呢?原因是C#编译器非常熟悉基元类型,会在编译代码时应用自己的特殊规则。也就是说,编译器能识别常见的编程模式。
但是,只有在转换安全的情况下,C#才允许隐式转换。所谓的安全是指不会发生数据丢失的情况。比如Int32转换为Int64。但如果可能不安全,C#就要求显示转换。对于数值类型,不安全意味着转换后可能丢失精度或数量级。例如Int32转Byte,Int32表示有符号32位二进制数,最大值为:2^16-1,而Byte表示无符号8位二进制数,最大值为:2^8-1,所以大的Int32可能丢失精度。
除了转型,基元类型还能写成字面值。字面值可以堪称基元类型本身的实例。所以可以调用实例方法,例如:
.ToString(); //Int32实例123调用ToString()方法
此外,如果表达式由字面值构成,编译器在编译时就能完成表达式求值,例如:
++; //生成的代码将a的值设为123 string b = "a"+"bc"; //生成的代码将b的值设为“abc”
最后,编译器知道如何和以什么顺序解析代码中的基元类型和操作符之间的运算,例如:
; //赋值操作 ; //加和赋值操作 ); //小于和赋值操作
参考文献:CLR via C#(第四版)
PS:新手正在学习.NET Framework,有什么错误希望各位指正!
【深入.NET平台】浅谈.NET Framework基元类型的更多相关文章
- CLR:基元类型、引用类型和值类型
最新更新请访问: http://denghejun.github.io 前言 今天重新看了下关于CLR基元类型的东西,觉得还是有必要将其记录下来,毕竟这是理解CLR成功 之路上的重要一步,希望你也 ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- 谈谈C#基元类型
首先看一下.NET 中的基元类型,如下表: C# Type | .NET Framework Type -------------| ---------------------- bool | Sys ...
- [CLR via C#]5.1 基元类型
原文:[CLR via C#]5.1 基元类型 某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们.例如可以使用以下语法来分配一个整数: System.Int32 a = ne ...
- C# 基元类型
C#编程中,初始化一个整数有两种方式: (1).较繁琐的方法,代码如下: Int32 a = new Int32(); (2).极简的方法,代码如下: ; 对比两种方法,分析如下: 第一种:过于繁琐, ...
- 重温CLR(四)基元类型、引用类型、值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C ...
- 6、使用基元类型而不要使用 FCL 类型
基元类型: int string object uint long ulong 等 ; FCL (Framework Class Library ) System.Int32 等. 一些定义在一些语言 ...
随机推荐
- Linux经常使用命令(更新中)
文件类: 1.创建目录:mkdir 例:sudo mkdir test 2.创建空文件:touch 例:sudo touch test.txt 3.删除文件:rm 删除文件不须要确认:rm -f 例: ...
- 有两个字符串a,b。假设a="ab",b="cd",判断字符串c="acbd"是属于a、b的组合。满足组合后a、b的内部顺序均不变。
#include<iostream> #include<string> using namespace std; int check(string a,string b,str ...
- oracle技术总结
http://www.cnblogs.com/jimeper/ http://blog.csdn.net/dragonxiangfu http://www.boobooke.com/bbs/threa ...
- 在CentOS上把MySQL从5.5升级到5.6
在CentOS上把MySQL从5.5升级到5.6 摘要:本文记录了在CentOS 6.3上,把MySQL从5.5.28升级到5.6.19的过程. 1. 概述 在我做的一个项目中,最近我对生产服务器上的 ...
- 小贝_mysql数据库备份与恢复
mysql数据库备份与恢复 简要: 一.数据库备份 二.数据库恢复 一.数据库备份 1.备份简单说明 : 系统执行中,增量备份与总体备份 例: 每周日总体备份一次,周一到周 ...
- HDU1251 统计难题 【trie树】
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- easyUI的tree
前端使用easyUI,放了一个tree,搞死了. easyUI的tree,后端传过来的数据,是json格式:然后easyUI向后端提交.请求时,会自动将节点的id附在url后面. 主要有两个注意的地方 ...
- mongodb05---游标
游标cursor: 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取.就像php中的fopen打开文件,得到一个资源一样, 通过资源,可以一行一行的读文件. v ...
- RK3288以太网的mac地址调试笔记【学习笔记】【原创】
平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:提供以太网mac ...
- YTU 2952: A代码填充--谁挡住了我
2952: A代码填充--谁挡住了我 时间限制: 1 Sec 内存限制: 128 MB 提交: 135 解决: 38 题目描述 n个人前后站成一列,对于队列中的任意一个人,如果排在他前面的人的身高 ...