转自:http://blog.csdn.net/shanyongxu/article/details/50879598,请点击链接查看原文,尊重楼主大大的版权。
BCL(Base Class Library基本类库):
在创建项目时并没有做任何额外的操作,那么这些引用显然是在创建项目时自动添加的.为了让楼主变得更加的明白一点,这里做一点说明:要使用其他开发者所设计的类型,就需要在项目中将该类型所在的程序集引用进来.现在看到的这些程序集引用,都是微软觉得很常用的,几乎是每个项目都会用到的,所以在创建项目时自动添加了进来,免得开发者再手动添加.
但是在这里这些引用不利于我们理解一些内容,所以我们把这些引用全部删除,如下图这样:
然后再次编译程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
string text = "hello,world";
Console.WriteLine(text);
}
}
}
可能有人会说,在删掉这些引用之后,编译器将会毫不客气的给我们提示错误:未能找到类型或命名空间”System”(是否缺少using指令或程序集引用?)但是实际上,程序会正确执行,为啥?先想想这样一个问题:我们已经删掉了所有引用的程序集,只定义了一个Program类型,并没有定义Console类型,所以此时要面对的是Console类型从哪里来?
VS提供了一个快捷的办法使我们可以快速的查看类型:将光标定位在Console上,然后F12,就可以看到Console的类型定义.在Console类型定义的最上方,可以看到它所在的程序集地址:
#region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll
#endregion
你可以顺道看看Console的定义,能看到Console类型来自于mscorlib.dll这个程序集.
从上面的实验我们可以看出,不管我们是否引用mscorlib.dll程序集,它总是会自动引用进来.
这个程序集中所包含的类库,就是本次题目中的 BDL(Base Class Library).
通过名字就能看出来,这个类库包含的都是些最基本的类型,其本身已经与CIL语言融为一体得,为CIL语言提供基础的编程支持,以至于该类库已经成为了CIL标准的一部分.
我们可以使用菜单->视图->对象浏览器来查看mscorlib.dll程序集中都包含了哪些命名空间和类型:
可以看到该程序集下包含的主要是System命名空间,稍微细心一点就会发现,在新建项目的时候,还包含了System.dll程序集,并且所包含的类型与mscorlib中的类型很相似.
这要说明一个啥问题呢?或者说,这是咋回事呢?只要点开System命名空间就会发现,mscorlib.dll的System命名空间下面定义的类型和System.dll的System命名空间下面定义的类型完全不同,它们之间并没有冲突.
一句话:BCL提供了像Console这样的类型来支持开发者编写类似控制台这样的程序.
在看这样一个问题:写下string text=”hello,world”;这条语句中的string从哪里来的?string在C#是关键字,在VS中呈现一种特别的颜色,所以说string应该是C#提供的内置类型.可是,当楼主将光标移动到string上按下F12的时候,转到string的定义时,确是这样的:
#region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll
#endregion
能看到最上面的程序集地址吧怎么又是mscorlib.dll?并且string类型和Console类型一样,同位于System命名空间下.由此可见,C#的关键字string,不过是BCL中System.String类型的一个别名而已.类似的,VB.NET中的string关键字也是BCL中的System.String类型的别名.因此,在.NET框架中国,语言从本质上来说没有太大的区别,更多的区别是在语法上面.从上面的例子中也能看出,C#和VB.Net的很多语言能力并不是自己的,而是从CIL”借过来”的,这样做也保证了在不同的语言中相应类型的行为是一致的.
下面说个不同语言关键字与CIL类型的对应关系:
CIL类型 C#关键字 VB.NET关键字
System.Byte byte Byte
其实有很多,这里楼主只是想说明这个意思.
从上面可以看出,.NET同时也对语言开发者提供支持.假如有一天你需要设计一款语言,那么在开发编译器的时候将关键字映射为CIL中的类型就可以了,也就是说,对自己语言中的一些特殊符号(关键字)进行映射处理,就好像C#中的关键字int和string一样.
不知道大家听说过基元类型(Primitive Type)吗?没听过不要紧,楼主也是第一次听说。
大家应该明白的是那些由编译器直接支持,将语言本身的关键字类型转换为CIL类型的,就叫做基元类型,显然,byte,int,string都是基元类型.而C#中并没有关键字去映射Console,所以我们认为Console只是普通的类类型(Class Type).
FCL---Framework Class Library框架类库
其实和我们每天都要打交道的就是FCL了(Framework Class Library),框架类库.前面说的BCL是FCL的一个子集.BCL中包含了与编译器以及CIL语言关系紧密的核心类型,以及常见开发任务中都会用到的类型.而FCL包含的内容很多,服务于一种应用场景的子类库就可以写一本书了...
从功能上看,可以将FCL框架类库划分为以下几层:
最内一层,由BCL的大部分组成,主要作用是对.NET框架,.NET运行时以及CIL语言本身进行支持,例如基元类型,集合类型,线程处理,应用程序域,运行时,安全性,互操作等.
中间一层,包含了对操作系统功能的封装,例如文件系统,网络连接,图形图像,XML操作等.
最外一层,包含各种类型的应用程序,例如Window Forms,Asp.NET,WPF,WCF,WF等.