BCL和FCL

BCLFCL

 

楼主最近这几个月都没有写代码,一直在看些理论方面的知识,感觉代码的东西都忘了,,昨天尽然连SQL查询语句的where用法都忘了,楼主表示现在这样到底对不对,因为楼主感觉代码这个玩意和理论性比来说不值得一提,楼主是这么想的,世界上的语言有很多,要想都学明白很难,如果咱们学方法,会了方法就能一通百通,那岂不是很好?这是楼主的愚见,如有不同意见,勿喷,欢迎指点.

 

咱们先看一下一个有意思的现象:再次打开前面创建的C#控制台项目(ConsoleApp),然后在解决方案面板下打开”引用”文件夹,可能因为VS的版本不同,显示的内容略有差异,但是没关系,阻止不了我们的热情.


在创建项目时并没有做任何额外的操作,那么这些引用显然是在创建项目时自动添加的.为了让楼主变得更加的明白一点,这里做一点说明:要使用其他开发者所设计的类型,就需要在项目中将该类型所在的程序集引用进来.现在看到的这些程序集引用,都是微软觉得很常用的,几乎是每个项目都会用到的,所以在创建项目时自动添加了进来,免得开发者再手动添加.

 

但是在这里这些引用不利于我们理解一些内容,所以我们把这些引用全部删除,如下图这样:

 

然后再次编译程序:

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.dllSystem命名空间下面定义的类型和System.dllSystem命名空间下面定义的类型完全不同,它们之间并没有冲突.

 

一句话:BCL提供了想Console这样的类型来支持开发者编写类似控制台这样的程序.

 

在看这样一个问题:写下string text=”hello,world”;这条语句中的string从哪里来的?stringC#是关键字,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,不过是BCLSystem.String类型的一个别名而已.类似的,VB.NET中的string关键字也是BCL中的System.String类型的别名.因此,.NET框架中国,语言从本质上来说没有太大的区别,更多的区别是在语法上面.从上面的例子中也能看出,C#VB.NET的很多语言能力并不是自己的,而是从CIL”借过来”的,这样做也保证了在不同的语言中相应类型的行为是一致的.

 

下面说个不同语言关键字与CIL类型的对应关系:

CIL类型C#关键字VB.NET关键字

System.Byte byte Byte

 

其实有很多,这里楼主只是想说明这个意思.

 

从上面可以看出,.NET同时也对语言开发者提供支持.假如有一天你需要设计一款语言,那么在开发编译器的时候将关键字映射为CIL中的类型就可以了,也就是说,对自己语言中的一些特殊符号(关键字)进行映射处理,就好像C#中的关键字intstring一样.

 

不知道大家听说过基于类型(Primitive Type)?没听过不要紧,楼主也是第一次听说,大家应该明白的是那些由编译器直接支持,将语言本身的关键字类型转换为CIL类型的,就叫做基元类型,显然,byte,int,string都是基元类型.C#中并没有关键字去映射Console,所以我们认为Console知识普通的类类型(Class Type).

 

 

FCL----框架类库

 

其实和我们每天都要打交道的就是FCL(Framework Class Library),框架类库.前面说的BCLFCL的一个子集.BCL中包含了与编译器以及CIL语言关系紧密的核心类型,以及常见开发任务中都会用到的类型.FCL包含的内容很多,服务于一种应用场景的子类库就可以写一本书了...

 

从功能上看,可以将FCL框架类库划分为以下几层:

最内一层,BCL的大部分组成,主要作用是对.NET框架,.NET运行时以及CIL语言本身进行支持,例如基元类型,集合类型,线程处理,应用程序域,运行时,安全性,互操作等.

 

中间一层,包含了对操作系统功能的封装,例如文件系统,网络连接,图形图像,XML操作等.

 

最外一层,包含各种类型的应用程序,例如Window Forms,Asp.NET,WPF,WCF,WF.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值