• 什么是基元类型?

初学者可能很少听说过这个名词,但是平时用得最多的肯定是基元类型。先看下面两行代码:

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基元类型的更多相关文章

  1. CLR:基元类型、引用类型和值类型

    最新更新请访问: http://denghejun.github.io   前言 今天重新看了下关于CLR基元类型的东西,觉得还是有必要将其记录下来,毕竟这是理解CLR成功 之路上的重要一步,希望你也 ...

  2. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  3. 【CLR Via C#】第5章 基元类型、引用类型、值类型

    第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...

  4. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  5. 谈谈C#基元类型

    首先看一下.NET 中的基元类型,如下表: C# Type | .NET Framework Type -------------| ---------------------- bool | Sys ...

  6. [CLR via C#]5.1 基元类型

    原文:[CLR via C#]5.1 基元类型 某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们.例如可以使用以下语法来分配一个整数: System.Int32 a = ne ...

  7. C# 基元类型

    C#编程中,初始化一个整数有两种方式: (1).较繁琐的方法,代码如下: Int32 a = new Int32(); (2).极简的方法,代码如下: ; 对比两种方法,分析如下: 第一种:过于繁琐, ...

  8. 重温CLR(四)基元类型、引用类型、值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C ...

  9. 6、使用基元类型而不要使用 FCL 类型

    基元类型: int string object uint long ulong 等 ; FCL (Framework Class Library ) System.Int32 等. 一些定义在一些语言 ...

随机推荐

  1. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  2. java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

    public class txs { static void leftbit(){ int i;               //整型长度为32位                           ...

  3. 【git体验】git原理及基础

    原理:分布式版本号控制系统像 Git,Mercurial,Bazaar 以及 Darcs 等,client并不仅仅提取最新版本号 的文件快照,而是把原始的代码仓库完整地镜像下来. 这么一来.不论什么一 ...

  4. udhcp详解源码(序)

    最近负责接入模块,包括dhcp.ipoe和pppoe等等.所以需要对dhcp和ppp这几个app的源代码进行一些分析.网上有比较好的文章,参考并补充自己的分析. 这篇udhcp详解是基于busybox ...

  5. 1 Angular 2 简介与 AngularJS 1.x 历史对比

    Angular 2 是一款JavaScript的开源框架,用于协助单一页面应用程序运行.Angular 2 是 AngularJS 1.x 的升级版本,应Web的进化和前端开发的变革还有从Angula ...

  6. uml时序图的初印象-------Day64

    近期有好多想法迫不及待的想去实现,但是其实是在那些最開始想的很明确,感觉会没问题的地方也总是会出现故障,导致稍微有些急躁,还是要淡定啊.又到了周末.明后天要收拾东西搬家,不知道宽带能不能顺利的给挪过去 ...

  7. Sql数据库查询语言

    1.概述 Sql是一种面向数据库的结构化查询语言.是符合美国国家标准化组织ANSI的一种计算机标准语言. Sql具对数据库的操作有:增删改查.创建数据库.创建表.创建存储过程.创建视图等 RDBMS关 ...

  8. 再谈HBase八大应用场景

    HBase概述 HBase是一个分布式存储.数据库引擎,可以支持千万的QPS.PB级别的存储,这些都已经在生产环境验证,并且在广大的公司已经验证.特别是阿里.小米.京东.滴滴内部都有数千.上万台的HB ...

  9. Why Do Microservices Need an API Gateway?

    Why Do Microservices Need an API Gateway? - DZone Integration https://dzone.com/articles/why-do-micr ...

  10. 利用chrome调试手机网页

    1.pc端安装最新的chrome 2.手机端安装最新的chrome ( Android机 )ms不需要 3.USB连接线 4.打开电脑的chrome 在地址栏输入 chrome://inspect