由于博主对C#的使用比较多,但是对C#的理解还是停留在表面,所以开创此系列篇章,详细记录在学习Essential C# 6.0 这本书时候遇到的问题,以及优秀的知识点的记录,还有自己对一些知识点的理解以及拓展。
该系列文章绝不是简单的阐述概念,而是将知识点互相串通,融入使用。欢迎大家关注,文章会持续更新!!!
原文链接
文章链接
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#类继承。
(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类别等。
原文链接
1、是什么?
Dynamic Link Library,动态链接库,也称为元件,CLR与BCL都是由元件构成。当我们在.EXE应用程序的时候,相应的DLL文件就会被调用,一个应用程序被分割成独立的动态链接库,可以有多个DLL文件,一个DLL文件也可以被多个应用程序共享。
2、DLL文件的作用
如果所需的文件全部放在应用程序中,那样应用程序就会很大,所占用的磁盘空间也会很大,重建时还要重新编译所有代码。而有了DLL文件就不一样了,可以将程序模块创建独立的DLL文件,只有调用的时候,才会占用内存空间。
原文链接
1、是什么?
Assembly程序集,由编译器得到,供CLR进一步编译执行中间产物MSIL,一般表现为.DLL,或者.EXE格式,必须依靠CLR才能顺利执行。它是一个或多个托管模块以及资源文件的组合,包含可执行应用程序.EXE以及动态链接库.DLL,是.NET Framework的组成部分。
2、组成部分
(1)程序集的自我描述:元数据以及程序集清单。
(2)实现这些类型的MSIL代码
(3)资源集(例如:位图)。
3、静态程序集 VS 动态程序集
静态程序集存储在可移植可执行PE文件中,动态程序集直接从内存运行,在执行前不存储到磁盘里。
首先,浮点数的精度是可变的
除非使用分数表示时分母恰好是2的整数次幂,否则使用二进制浮点类型也无法准确地表示该数。
将浮点变量设置为1,很容易表示成0.99999999…,或者1.00000000000000001(或者其他很接近1的数字)。
所以,浮点数的精度与它所代表的数字的大小成正比。如果数字越大,精度越低。
占用位数越多、表示范围越小的,精度越高
占用位数越少、表示范围越大的,精度越低
常见的浮点类型
二进制浮点数
十进制浮点数
decimal常用于金融计算,与二进制表示浮点数不同,decimal类型可以保证范围内的所有十进制都是精确的。所以,对应decimal来说,0.1就是0.1
不过,虽然精度更高,但是表示的范围更小。所以,二进制浮点类型转十进制的任意出现溢出错误。另外,decimal的计算速度稍慢(可忽略不计)
浮点数十进制与二进制的转换
表示源代码中固定的值,比如说
Console.WriteLine(123);
这里的123就是字面量,如果我们需要修改,则需要重新编译代码。
所以开发者在使用字面量的时候需要极其慎重
默认情况下,最后一位会被舍弃,显示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);
}
Unicode是一个国际化标准,用来表示大多数语言中的字符。它便于计算机系统构建本地化的应用程序,为不同的语言文化显示具有本地特色的字符
但是,很不幸,不是所有的Unicode字符都能够用一个16位的char表示。刚开始提出Unicode的概念时,它的设计者认为16位已经足够。但是随着支持的语言越来越多,才发现是错误的。结果是,一些Unicode字符要由一对“代理项”的char构成,共32位
目前静态方法的调用通常是包含一个命名空间的前缀后面跟类型名。
比如我们使用WriLine这个方法,我们就必须要在方法名前面使用命名空间前缀System后面跟类型名Console,才可以使用这个静态方法
为了方便,我们可以如下简写,这个C# 6.0新增的指令
using static System.Console;
class Program
{
static void Main(string[] args)
{
WriteLine("欢迎关注 荷兰猪小灰灰");
}
}
null表示要将变量设为“无”,null只能赋值给引用类型、指针类型、可空值类型
如果是值类型,是无法设置为null的
但是我们可以使用可空修饰符,让其强制赋值null
首先,我们发生溢出的时候
static void Main(string[] args)
{
int x = int.MaxValue;
x = x + 1;
Console.WriteLine(x);
}
但是,如果我们用checked语句块将其包裹起来,就会自动保护我们的变量,不会越界,报错提醒程序员
我们编辑器默认是unchecked模式,我们可以去设置这个选项
它与Parse最大的区别就是,转换失败之后返回False而不会产生异常
本章提到了decimal类型,他可以用于金融计算
以及@作为逐字符前缀,会抵消掉转义字符 ‘\’
为了实现数据类型之间的转换,还提供了显式转型和隐式转型
下一章将会讨论表达式和控制流语句