C#入门经典第七版读书笔记1(C#简介)

文章目录

  • 导言
  • C#简介
  • .NET简介
  • 使用 .NET Framework进行程序开发
    • CIL和JIT
    • 程序集
    • 托管代码
    • 垃圾回收
    • 链接
  • C#的用途

导言

       笔者最近因为某些原因需要对C# Windows Forms编程有所涉及,奈何对于C#也就停留在了输出Hello World的水平上,由于时间相对比较宽裕,因此决定系统地学习一下C#编程的相关知识。
       笔者目前是以《C#入门经典第七版》作为入门书籍进行学习,特开此篇博客作为C#入门学习的第一篇笔记。目前的规划是每一篇笔记对应着书中的一个章节,遇到感兴趣的内容可能会进行对应的扩展。


C#简介

       C#是微软推出的一种.NET框架的、面向对象的高级编程语言。C#以.NET框架类库作为基础,拥有类似Visual Basic的快速开发能力。C#是由安德斯·海尔斯伯格主持开发的,微软在2000年发布了这种语言,并希望借助这种语言来取代Java。之后随着其不断的发展,C#屹然成为了Ecma国际和国际标准组织的标准规范。
       C#的发音为“C sharp”,该命名启发于音乐中的音名,在音乐中C#表示C升半音,因此微软也是借助于这样的命名,来表示C#在一些语言特性方面是对C++的一种提升(为什么不是c的提升,难道是#可以看做两个+?)。
       C#的前身是Visual J++,该语言是由原Borland公司的首席研发设计师安德斯·海尔斯伯格(Anders Hejlsberg)在微软开发出来的,很快的Visual J++便由1.1版本升级到6.0版。期间SUN公司认为Visual J++ 违反了Java开发平台的中立性,便对微软提出了诉讼。于是2000年6月26日,微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,发表了新的语言C#。C#语言随后取代了Visual J++,语言本身深受Visual Basic、Java、C和C++ 的影响。
       下图展示了历代C#的版本以及相关产品的版本信息(.NET框架,Visual Studio等):
C#入门经典第七版读书笔记1(C#简介)_第1张图片
(以上摘自维基百科)


.NET简介

       前面说过,C#是基于.NET框架的,因此对于.NET框架便不得不了解一番了。
       .NET Framework是由微软开发的,一个致力于敏捷软件开发(agile software development)、快速应用开发(rapid application development)、平台无关性和网络透明化的软件框架。从某种意义上来说,这是一个具有革命意义的平台。在2000年代,.NET无疑是在服务器和桌面型软件工程领域,迈出了历史性的一大步。
       这里便要说说其中的一个关键词跨平台性,尽管我们平常遇到的更多的是运行在Windows平台上的 .NET Framework,但事实上它也有运行在其它系统上的版本。例如Mono,它是 .NET Framework的开源版本(包含C#编译器),该版本便可以运行在多个操作系统之上,如Linux系统和Mac OS甚至于Android系统。说到这里,如果有java基础的朋友可能就会感到有点儿熟悉,没错,C#语言也是一种编译性语言,它的跨平台的实现方式跟java的跨平台方式是一致的,在运行前,它们都是先编译成中间代码(Common Internediate Language,CIL),然后再由不同版本的虚拟机(编译器,JIT)来将中间代码转换成机器码来运行的,当然这里的CIL并不是专门为C#服务的,对于其它.NET语言一样会经过这个步骤。不过这里不得不说的就是C#的跨平台性没有如java一般那么彻底。其官方的.NET环境只能运行在Windows系统之上,不像java,在多个系统上都提供了对应的虚拟机和运行环境,毕竟要挣钱嘛,表示理解(2014年11月12日,微软宣布将完全开放.NET框架的源代码,并提供给Linux和macOS使用)。当然官方没有,民间自有高手,就像上面说的Mono,它就是民间的一个开源项目,虽然还没有源生的那么完善,但也在不断地优化进步着。
       .NET Framework主要包含了一个庞大的代码库,开发者们可以通过多种客户端语言来调用它们从而实现自己的目的,客户端语言如C#、F#、Python、C++等。库下分列出了多个模块,模块下还细分了子模块,开发者可以针对自己所需要的模块,选择性地进行加载使用,从而进行针对性开发。除了代码库外,其还提供了公共运行库(Common Language Runtime,CLR),其主要负责管理用.NET库开发的所有应用程序的执行。
       下图展示了.NET框架的历史版本概览
C#入门经典第七版读书笔记1(C#简介)_第2张图片
       一般情况下,windows系统的电脑会预装有.NET环境,可以通过【windows键+r键】打开运行窗口,在输入框中键入optionalfeatures,可以打开【windows功能】窗口,在此处可以看到预装的.Net版本,当然也可以通过控制面板打开这个窗口。
C#入门经典第七版读书笔记1(C#简介)_第3张图片
       在该窗口,可以查看Windows系统内预装的 .NET Framework版本。
C#入门经典第七版读书笔记1(C#简介)_第4张图片


使用 .NET Framework进行程序开发


CIL和JIT

       借助 .NET Framework,开发者们可以快速开发出自己的应用程序。使用任意客户端语言,便可以便捷地使用 .NET Framework的强大功能,当然这里我们选用的客户端语言自然就是C#了。
       当我们写好程序进行编译时,其实并没有立即创建出供操作系统运行的本机代码。而是将代码编译成了通用中间语言(Common Intermediate Language,CIL),该代码不针对操作系统,也不针对某种语言,除了C#其它的客户端语言进行编译时,也会经历这一步骤。这里的编译过程一般是通过一些IDE工具来完成的,这里将使用Visual Studio来完成编译工作,关于Visual Studio的使用会在后面的篇幅中进行详细介绍,它是由微软开发出的一套工具集。
       中间代码将由Just-In-Time(JIT)编译器再次编译为系统可以识别的机器代码,从而实现程序运行的目的。从JIT的名字中也可以简单地看出一点儿,JIT的编译行为可以在程序的运行过程中动态发生,一般情况下,我们不需要干涉这个过程,除非要编写一些性能十分关键的代码。
       以往,同一个应用程序往往需要编译多次, 从而适应不同的操作系统和CPU结构。然而现在就不需要了,CIL并不针对于特定的系统或者CPU结构,因此应用只需要进行一次编译,针对不同的系统、CPU架构只需要使用对应的JIT,便可以十分便捷地将CIL编译为对应的机器码进行运行。


程序集

       程序进行编译时,创建的CIL代码都存储在一个程序集中。程序集内包含了可执行的应用程序和其它应用程序使用的库。
       除了包含CIL代码外,程序集中还包含元信息(程序集中包含的数据的信息,也称为元数据)和可选的资源(CIL使用的其它资源,如媒体文件)。元信息是允许程序集进行自描述的,CLR通过元信息可以直接判断出程序集的依赖对象是什么,无需再在注册表内或者Active Directory Domain Services(ADDS)中进行额外的信息注册。该特性使得程序集更容易部署,在目标计算机装有CLR运行环境情况下,只需将应用文件直接复制到目标计算机上即可运行。


托管代码

       在篇幅的开头,提到了公共运行库(Common Language Runtime,CLR),其主要负责管理用.NET库开发的所有应用程序的执行。在代码编译为CIL后,再由JIT将其编译为本机代码,CLR还需要管理正在运行的用 .NET Framework编写的代码,具体的管理方式有管理内存、处理安全性、允许进行跨语言调试等,这类代码便称作为托管代码。
       相对应的,不受CLR控制运行的程序便为非托管类型,某些语言(如C++)便可以用于编写该类应用。在C#中,我们只能编写在托管环境下运行的代码,我们借助CLR的托管功能,让.NET为我们处理应用与操作系统的交互问题。


垃圾回收

       上面我们提到了托管代码,而垃圾回收则是托管代码最重要的功能之一(这里笔者又自然地想到了java里的垃圾回收机制,不愧是一对冤家啊)。
       在.NET推出以前,垃圾回收这项工作还需要程序员自己进行相应的处理,一不小心,就会引起十分重大的后果,如内存溢出导致程序崩溃等。
       .NET的垃圾回收会定期检查计算机的内存,从中删除掉不再需要的内容,这个过程本身具有时间的不确定性,可能一秒内检查了很多次,也有可能是过了几秒才执行一次。这一点在编写一些高性能的程序时,是需要着重关注的,我们可能需要进行手动释放内存来适应一些场景。


链接

       在将C#代码编译为CIL的过程中,C#代码并不一定在一个单独的文件之内(现实环境中确实会有处于多个文件中的情况),此时我们可以通过链接(linking)来将多个源文件编译到一个程序集中。该方式可以提高程序的处理性能,同时也方便协同工作和日和的维护。


C#的用途

       从上面的篇幅中,我们知道了C#是可以用于创建运行在 .NET CLR上的程序的语言之一。C#是从C和C++中演化出来的,正所谓站在巨人的肩膀上看世界,C#吸取了以往语言的优点,摒弃了其中的一些失败之笔,并优化了其中的一些问题。
       相比C++,C#的语法更为简单。尽管拥有了更为简单的语法,但几乎能实现C++的所有功能。当然,相对于C++中的一些高级操作,如直接访问和操作系统内存,C#中只能在标有“unsafe”的代码块中使用,这种直接与系统内存进行交互的行为存在着潜在的危险性,可能覆盖系统中重要的内存块,因此需要格外小心。
       C#是一种类型安全的语言,相比C++具有更高的安全性,但与之付出的就是相比于C++,在实现同样的功能的前提下,使用C#开发的代码量要比使用C++做开发的代码量稍多。当然,这也许并不是一个坏事,尽管相对C++牺牲了一些代码的简洁性,但使得整体的安全性得到了提升,使得代码更加健壮,更容易调试。
       C#作为Microsoft专门为 .Net Framework所设计的一种语言,无疑最大程度地支持了 .Net Framework的所有功能,并且随着 .Net Framework的版本提升,C#也在不断地进行着同步的更新,不断地支持新的功能特性。
       C#可以用于开发多种多样的应用程序, .Net Framework本身也没有限制应用程序的类型。C#主要有以下几种常见的应用程序类型:

  • 桌面应用程序
  • Windows Store应用程序
  • 云/WEB应用程序
  • Web API
  • WCF 程序

        .Net Framework中的Active Data Objects .NET(ADO .NET)部分,ADO .NET Entity Framework或者C#的LINQ(Language Intergrated Query)功能还能为上述多样化的应用种类提供数据库访问功能。


       在之后的学习中会不断接触上述的内容,本章内容到此结束,在之后的篇幅中将会继续介绍其它的内容。

你可能感兴趣的:(C#)