1.1 了解C#的基础生态
1.1.1 .NETFrameWork
.NETFrameWork是微软的基础生态
.NET运行框架
挑几个重要的说说:
1.1.2 COM组件与.NET组件(上图第三层)
COM组件和.NET组件都是帮助应用程序可以在windows平台上运行的底层接口。
利用COM组件,可以实现非托管代码(C/C++)程序和托管代码(CLR程序)的交互
.NET是在基于COM组件的基础上发展而来的,是微软为了实现跨平台运行而推出的,也就是安装了. NET FrameWork的电脑都可以正常运行,而基于COM开发的程序,只能运行在Windows平台中
我本人到目前为止还没有真正利用. NET框架真正开发过跨平台的应用,虽然. NET框架包含了COM组件,但是我觉得如果想要开发跨平台的应用,还是尽量避免使用COM组件,但是如果只在Windows平台上运行,则无需担心这点
1.1.3 CLR(上图第四层)
CLR(公共语言运行库 Common Language Runtime)类似于Java虚拟机,是可以让编译出来(IL中间语言)的托管代码运行在各个平台的运行时库。
它的职责是:
负责资源管理和垃圾收集等等工作
保证底层系统和应用之间必要的分离
说明下什么是托管代码和非托管代码
托管代码:Microsoft的中间语言(IL),作用于CLR
主要作用在 .NET Framework的CLR编译,只要是CLR编译器编译出来的程序集,就能够在安装有CLR程序的电脑中运行,目前应用CLR最为广泛的语言:C#、VB、F#、Iron Python、Ruby等等
IL通过JIT最终变为机器语言
非托管代码:CLR诞生之前,那些只能在同一个系统中运行的代码,即C\C++(去想想交叉编译链多复杂吧)
注:托管、非托管代码和托管非托管资源不是一回事儿,托管、非托管资源会在GC垃圾回收机制中进行说明
什么是JIT
JIT(即时编译 Just In Time),是.NET运行可执行程序的基本方式。虽然在上图中,并没有体现出JIT,但是刚刚说了,运行的是一种中间语言即IL,而JIT编译器干的事情就是输入IL,输出的是机器语言。也就是说,只有当需要的时候,JIT即时编译器才会将之前编译好的中间语言转换为机器语言
1.1.4 框架类库FCL(上图第五层)
在C#开发过程中,可以用到大量的微软为我们提供的框架类库
基础类库BCL
Base Class Library的缩写,这里提供了一个综合性的面向对象可重用类型集合。举个例子,在开发过程中,使用的string、List容器等等等都出自BCL
WCF
Windows Communication Foundation(Windows通信开发平台),整合了原有的Windows通信的WebService、Socket、HTTP、FTP等。是.NETFramework中的SOA。通俗一点的理解,可以认为WCF是一个数据的搬运工,是一种连接各个系统的强大方式
WPF/UWP
这两项技术脱胎于经典的WinForm,但是从底层来看,两者没有任何联系,WFP的推出是微软用来取代WinForm的,有关于在Windows上开发界面的框架,发展线路可以归结为:WinForm->WPF->UWP。
在WPF中,微软开发了一套类似HTML + CSS 一样的XAML语言,使得界面与后端解耦和
WPF是调用的图形接口是DirectX9.0,所以运行WPF程序,需要电脑显卡在硬件上至少支持DX9
UWP是微软针对Win10系统,基于WPF扩展而来的,不仅可以使用XAML语言,还可以使用HTML和JavaScript进行Windows界面的开发
ADO. NET\SQL
如果是一套业务系统程序,那么一定会涉及到数据库开发,这个就会用到微软为我们提供的ADO. NET程序集
1.1.5 CTS和CLS(上图第六层)
这两个不必深究,就是两个标准,使用过程中会很自然的用到。
CTS(Common Type System)通用类型系统,诸如类型的属性、方法、public,private访问权限,都是出自这个标准
CLS(Common Language Specification)公共语言规范,在编译程序的时候,编译器为我们返回的很多警告,都是来自于CLS的
2 C#核心三巨头:属性、委托、泛型
在了解了属性、委托、泛型这三种最基础的用法,那么在后续使用C#的过程中,剩下的就是去了解FCL为我们提供的各种各样的类型了,因为这些类型无外乎通过这三种方式为我们暴露接口
2.1 有关属性
推荐的C#编程原则:使用属性代替成员变量
C#通过控制成员变量的属性的访问入口,即Get、Set来控制类型的成员变量
属性带来的好处:
使用属性暴露对外接口,同时可以使用属性限制访问权限
设置只读、只写属性
检查数据是否正确(比如年龄不能小于0)
使用属性在客户端访问或设置成员的时候,能够产生一些副作用
例如记录缓存、日志
在属性的get\set方法中检测数据安全、线程安全等
等等