> 文档中心 > Essential C# 6.0 C#学习笔记 第二章 基本数据类型

Essential C# 6.0 C#学习笔记 第二章 基本数据类型


Essential C# 6.0 学习笔记

由于博主对C#的使用比较多,但是对C#的理解还是停留在表面,所以开创此系列篇章,详细记录在学习Essential C# 6.0 这本书时候遇到的问题,以及优秀的知识点的记录,还有自己对一些知识点的理解以及拓展。

该系列文章绝不是简单的阐述概念,而是将知识点互相串通,融入使用。欢迎大家关注,文章会持续更新!!!


第二章 基本数据类型

文章目录

  • Essential C# 6.0 学习笔记
  • 第二章 基本数据类型
    • 1.CLR 公共语言运行时
    • 2.BCL 基础类库
    • 3.DLL 动态链接库
    • 4.Assembly 程序集
    • 5.二进制浮点类型和十进制浮点类型
    • 6.字面量或字面值
    • 7.round-trip格式化
    • 8.Unicode标准
    • 9.using static指令
    • 10.可空修饰符 ? null
    • 11.checked和unchecked转换
    • 12.使用TryParse()代替无效转型异常
  • 总结

1.CLR 公共语言运行时

原文链接
文章链接
CLR是CLI的VES(虚拟执行系统)部分的实际实现,并且是MS.NET平台的核心组件之一

用外行人的语言,CLI是一种食谱,而CLR是美食

CLR(通用语言运行时)是Microsoft对VES(虚拟执行系统)的实现。 VES以及CTS(通用types系统),CLS(通用语言规范)和元数据规范都是CLI(通用语言基础结构)规范的一部分。

VES是一个标准化的虚拟机规范,为了加载和执行CIL(通用中间语言)模块(dll和exe),必须实现该规范。 VES实现还提供运行时服务,如垃圾收集和安全性。

1、CLR是什么?
Common Language Runtime,公共语言运行时,和JVM(Java Virtual Machine,Java虚拟机实现了Java的与平台无关的特性,它屏蔽了平台的具体信息,只需生成在Java虚拟机上运行的目标代码就可以在任何平台上都可以运行。一次编译,到处运行)一样是运行环境

2、用来做什么?
CLR主要负责资源管理,例如内存分配,垃圾收集处理,以及保证应用和底层操作系统之间必要的分离。

3、如何对代码进行管理

(1)选择编译器

(2)将托管代码(在CLR监视下运行程序的代码)编译为MSIL(Microsoft Intermediate Language 微软中间语言)。在产生MSIL的同时产生元数据(Metadata,描述数据的数据,主要描述数据类型定义,代码引用等)共同包含在一个可移植可执行PE(Portable Executable)文件中。

(3)用CLR自带的JIT编译器将MSIL编译成机器语言,JIT可以检测代码的安全性。

(4)执行代码,只需首次调用编译。

4、优点
CLR的最重要的特性是:跨语言,也就是说用VB.NET写的类,可以被C#类继承。

2.BCL 基础类库

(P23)
每种变量类型的完整名称都是在BCL里面的,该名称在所有语言中都是相同的,而且对程序集里的类型进行了唯一性表示
所以我们C#创建变量的时候可以使用C#关键字,也可以用BCL里面的完整名称
不管怎么样,最终生成的CIL代码,都是变成BCL里面的完整名称

原文链接
1、是什么?

Base Class Library,基底类别库,是公共编程框架,是CLI(Common Language Infrastructure公共语言基础结构)规范之一。

2、有什么用?

(1)提供开发各种解决方案所需物件,加速开发解决方案的速度;

(2)将各种解决方案模型一致化;

(3)在.NET平台中开发小组可以使用不同语言。

3、组成

BCL基底类别库,包含数据库类别(ADO.NET),Windows类别,XML类别,图形类别(GDI+)系统类别,以及ASP.NET类别等。

3.DLL 动态链接库

原文链接

1、是什么?

Dynamic Link Library,动态链接库,也称为元件,CLR与BCL都是由元件构成。当我们在.EXE应用程序的时候,相应的DLL文件就会被调用,一个应用程序被分割成独立的动态链接库,可以有多个DLL文件,一个DLL文件也可以被多个应用程序共享。

2、DLL文件的作用

如果所需的文件全部放在应用程序中,那样应用程序就会很大,所占用的磁盘空间也会很大,重建时还要重新编译所有代码。而有了DLL文件就不一样了,可以将程序模块创建独立的DLL文件,只有调用的时候,才会占用内存空间。

4.Assembly 程序集

原文链接

1、是什么?

Assembly程序集,由编译器得到,供CLR进一步编译执行中间产物MSIL,一般表现为.DLL,或者.EXE格式,必须依靠CLR才能顺利执行。它是一个或多个托管模块以及资源文件的组合,包含可执行应用程序.EXE以及动态链接库.DLL,是.NET Framework的组成部分。

2、组成部分

(1)程序集的自我描述:元数据以及程序集清单。

(2)实现这些类型的MSIL代码

(3)资源集(例如:位图)。

3、静态程序集 VS 动态程序集

静态程序集存储在可移植可执行PE文件中,动态程序集直接从内存运行,在执行前不存储到磁盘里。

5.二进制浮点类型和十进制浮点类型

首先,浮点数的精度是可变的
除非使用分数表示时分母恰好是2的整数次幂,否则使用二进制浮点类型也无法准确地表示该数。
将浮点变量设置为1,很容易表示成0.99999999…,或者1.00000000000000001(或者其他很接近1的数字)。
所以,浮点数的精度与它所代表的数字的大小成正比。如果数字越大,精度越低。

占用位数越多、表示范围越小的,精度越高
占用位数越少、表示范围越大的,精度越低

常见的浮点类型
二进制浮点数
Essential C# 6.0 C#学习笔记 第二章 基本数据类型
十进制浮点数
Essential C# 6.0 C#学习笔记 第二章 基本数据类型
decimal常用于金融计算,与二进制表示浮点数不同,decimal类型可以保证范围内的所有十进制都是精确的。所以,对应decimal来说,0.1就是0.1
不过,虽然精度更高,但是表示的范围更小。所以,二进制浮点类型转十进制的任意出现溢出错误。另外,decimal的计算速度稍慢(可忽略不计)

浮点数十进制与二进制的转换

6.字面量或字面值

表示源代码中固定的值,比如说

Console.WriteLine(123);

这里的123就是字面量,如果我们需要修改,则需要重新编译代码。
所以开发者在使用字面量的时候需要极其慎重

7.round-trip格式化

默认情况下,最后一位会被舍弃,显示1.61803398874989,为了更精确的表示字符串格式下的double,我们就需要使用格式字符串和round-trip格式说明符R(r)进行转换
将round-trip格式说明符返回的字符串转换回数值肯定能获得原始值!

    static void Main(string[] args)    { const double number = 1.618033988749895; double result; string text; text = string.Format("{0}", number); result = double.Parse(text); Console.WriteLine(" {0}: result != number", result != number); text = string.Format("{0:R}", number); result = double.Parse(text); Console.WriteLine("{0}: result == number", result == number);    }

Essential C# 6.0 C#学习笔记 第二章 基本数据类型

8.Unicode标准

Unicode是一个国际化标准,用来表示大多数语言中的字符。它便于计算机系统构建本地化的应用程序,为不同的语言文化显示具有本地特色的字符
但是,很不幸,不是所有的Unicode字符都能够用一个16位的char表示。刚开始提出Unicode的概念时,它的设计者认为16位已经足够。但是随着支持的语言越来越多,才发现是错误的。结果是,一些Unicode字符要由一对“代理项”的char构成,共32位

9.using static指令

目前静态方法的调用通常是包含一个命名空间的前缀后面跟类型名。
比如我们使用WriLine这个方法,我们就必须要在方法名前面使用命名空间前缀System后面跟类型名Console,才可以使用这个静态方法
为了方便,我们可以如下简写,这个C# 6.0新增的指令

using static System.Console;class Program{    static void Main(string[] args)    { WriteLine("欢迎关注 荷兰猪小灰灰");    }}

10.可空修饰符 ? null

null表示要将变量设为“无”,null只能赋值给引用类型、指针类型、可空值类型
如果是值类型,是无法设置为null的
Essential C# 6.0 C#学习笔记 第二章 基本数据类型
但是我们可以使用可空修饰符,让其强制赋值null
Essential C# 6.0 C#学习笔记 第二章 基本数据类型

11.checked和unchecked转换

首先,我们发生溢出的时候

    static void Main(string[] args)    { int x = int.MaxValue; x = x + 1; Console.WriteLine(x);    }

Essential C# 6.0 C#学习笔记 第二章 基本数据类型
但是,如果我们用checked语句块将其包裹起来,就会自动保护我们的变量,不会越界,报错提醒程序员
Essential C# 6.0 C#学习笔记 第二章 基本数据类型
我们编辑器默认是unchecked模式,我们可以去设置这个选项

12.使用TryParse()代替无效转型异常

它与Parse最大的区别就是,转换失败之后返回False而不会产生异常

要想办法避免引发异常
Essential C# 6.0 C#学习笔记 第二章 基本数据类型

总结

本章提到了decimal类型,他可以用于金融计算
以及@作为逐字符前缀,会抵消掉转义字符 ‘\’
为了实现数据类型之间的转换,还提供了显式转型和隐式转型

下一章将会讨论表达式和控制流语句

Essential C# 6.0 C#学习笔记 第二章 基本数据类型 创作打卡挑战赛 Essential C# 6.0 C#学习笔记 第二章 基本数据类型 赢取流量/现金/CSDN周边激励大奖