第 1 章 你真的了解C#吗

在正式介绍C#的语法和特性之前,让我们首先来了解下它的发展历程。因为只有知道了C#的概貌和由来,积累了必要的背景知识,我们才能更好地掌握C#,进而使用C#来编程。

1.1 什么是C#

C#(发音为C Sharp)是由微软公司开发的一种面向对象且运行于.NET Framework之上的高级程序设计语言。它的基本语法与C和C++类似,但相比较而言,C#更加简单易学。如果你之前已经对上述的任何一种语言有所了解,就可以通过学习,在很短的时间里使用C#来编程。

C#还具有很多特性,例如封装方法签名的委托(类似于C++中的方法指针)、可为空的值类型、泛型方法和Lambda表达式等,这些特性都是其他语言所不具有的。C# 2.0支持泛型类型,从而避免了强制类型转换带来的性能损失;还提供了迭代器,因此可更简单地为集合类型实现自定义的迭代行为。在C# 3.0中,语言集成查询(LINQ)表达式使查询操作更为简单。C# 4.0中提供的动态类型,可以让开发者为类型实现自定义的动态行为,从而使在C#这样的静态语言中调用诸如Python的动态语言成为可能。

使用C#开发应用程序也比使用其他语言更简单、快速,因为C#语言是基于.NET Framework的。.NET Framework为开发应用程序提供了丰富的类库和图形控件,利用这些现有的控件就可以开发出一些应用程序。而且,C#的开发工具Visual Studio也提供了很多应用程序的模块,我们可以利用模块快速创建应用程序。

1.1.1 C#语言的发展历程

了解C#语言的发展历程具有重要的意义,因为只有当你知道了C#语言所具有的特性,才能更好地学习和掌握它们。

C#是微软公司在2000年6月发布的全新编程语言。在其诞生后的14年里,为了帮助开发人员更好地使用C#语言来编写应用程序,微软不断地更新C#语言的版本,每次升级都能带来让我们眼前一亮的新特性。表1-1列出了C#每个版本中所更新的特性和对应的.NET Framework版本。

表 1-1 C#各版本的新特性及对应的.NET Framework版本

C# 版本

.NET Framework版本

Visual Studio版本

发布日期

特性

C# 1.0

.NET Framework 1.0

Visual Studio .NET 2002

2002.1

委托事件

C# 1.1

.NET Framework 1.1

Visual Studio .NET 2003

2003.4

APM

C# 2.0

.NET Framework 2.0

Visual Studio 2005(开始命名为Visual Studio)

2005.11

泛型
匿名方法
迭代器可空类型

C# 3.0

.NET Framework 3.0
.NET Framework 3.5

Visual Studio 2008

2007.11

隐式类型的局部变量
对象集合初始化
自动实现属性
匿名类型
扩展方法
查询表达式
Lambda表达式
表达式树
分部类和分部方法
Linq

C# 4.0

.NET Framework 4.0

Visual Studio 2010

2010.4

动态绑定
命名和可选参数
泛型的协变和逆变
互操作性

C# 5.0

.NET Framework 4.5

Visual Studio 2012

2012.8

异步和等待调用方信息

从表1-1可以看出,对于C#的每一个版本,微软都是围绕某个主题进行更新的,图1-1更形象地总结了每个C#版本的主题。

图 1-1

1.1.2 C#能编写哪些应用程序

对于读者来说,最想达到的效果莫过于学完C#之后能立刻去开发应用程序。可以这么说,只要掌握了C#,你就能编写所看到的任何应用程序了,比如音乐播放器、电子商务平台,以及一些服务程序等。下面就介绍几种常见的应用程序类型。

1. Windows桌面应用程序

用C#实现Windows桌面应用程序较其他语言来说更为简单快速。主要原因在于,Windows Forms模块提供了一个强大的控件库,其中包含按钮、菜单等常用控件,用户可使用这些控件,通过拖拉的方式轻松地建立Windows用户界面。

另一方面,C#开发环境Visual Studio也很好地集成了Windows Forms模块,方便我们创建这类应用程序;而在.NET 3.0之后(对应于Visual Studio 2008),我们还可以使用Windows Presentation Foundation(WPF)来实现Windows桌面应用程序,WPF提供了更大的灵活性和更漂亮的外观,如图1-2所示。

图 1-2

2. Web应用程序

Web应用程序就是一些Web页面,通过浏览器可以查看这些Web页面。.NET Framework提供了ASP.NET技术来帮助我们实现该类应用程序。ASP.NET模块中包含丰富的控件库,我们可以利用这个控件库来制作出漂亮的Web页面。此外,Visual Studio也集成了该类应用程序的模板(如图1-3所示),使用模板来建立Web应用程序速度更快。

图 1-3

3. Web服务

Web服务是实现分布式应用程序的一种方式。这里举一个生活中的例子,帮助大家理解什么是服务:我们去饭店吃饭,就会有服务员来为我们服务点单。可以发现,服务即指我们不想自己去做,而希望别人帮助我们完成某件事情。

在开发过程中,我们也需要实现那些为其他应用程序提供服务的程序,C#语言可以帮助我们实现这类应用程序。在.NET Framework 3.0之后,微软提供了Windows Communication Foundation(WCF)技术来实现Web服务,Visual Studio中也集成了该应用程序的模板(如图1-4所示)。

图 1-4

C#可以实现任何类型的应用程序,上面只是简单介绍了其中最常见的3类应用程序。对于上面介绍的3种具体的技术,本书不会多作介绍,请读者朋友们参考相关图书和资料进行学习。

1.2 什么是.NET Framework

在前面的介绍中,.NET Framework这个词已经出现过多次了,然而它到底是什么呢?

我们可以这样去理解.NET Framework(.NET框架):C#是一门编程语言,它用于实现与计算机的对话,但C#编写的程序是需要编译和运行的,.NET Framework就是应用程序运行时的执行环境,为应用程序的执行提供以下几种服务。

  • 全面的类库 .NET Framework提供了丰富的类库以供调用,这使我们不必再去编写大量代码去处理常见的操作。

  • 内存管理 在许多其他的编程语言中,开发人员需要负责内存的分配和释放,以及对象生命周期的处理等任务。.NET Framework为了减轻开发人员的工作,提供了内存管理服务。

  • 通用类型系统(Common Type System,CTS) CTS定义了可以在中间语言中使用的预定义数据类型。

  • 开发结构和技术 .NET Framework提供了开发特定应用程序所需的库,如Web应用程序的ASP.NET技术。

  • 语言互操作性 面向.NET Framework的语言编译器都提供了生成中间语言代码的机制,这种机制使得不同语言之间进行互操作成为可能。

1.2.1 .NET Framework的组成

前面简单介绍了.NET Framework的概念,接下来,让我们看看.NET Framework具体是由哪几部分组成的。

.NET Framework包括公共语言运行时(Common Language Runtime,CLR)和.NET Framework类库(Framework Class Library,FCL)。

1. 公共语言运行时

公共语言运行时是.NET Framework的核心基础。我们可以将CLR看成一个在执行时管理代码的代理,它提供了内存管理、线程管理和异常处理等服务,而且还负责对代码实施严格的类型安全检查,保证了代码的正确性。我们将受CLR管理的代码称为托管代码(managed code),将不受CLR管理的代码称为非托管代码(unmanaged code)。

CLR包含两个组成部分:通用类型系统(Common Type System,CTS)和公共语言规范(Common Language Specification,CLS)。下面来具体了解这两个组件的功能。

  • CTS

    C#和VB.NET都是由CLR进行管理的,但是它们的语法和数据类型各不相同,CLR是如何对这两种不同的语言进行托管的呢?

    这得益于CTS。CTS用于解决不同语言之间数据类型不同的问题,如C#中整型是int,而VB.NET中的整型却是Integer,通过CTS可以把这两个类型变成通用类型Int32。所有.NET语言都共享CTS这一类型系统,从而使它们之间能够实现无缝互操作。

    CTS类型主要分为两大类:引用类型和值类型。如图1-5所示,这两种类型之间存在着相互转化,转化方法分别为装箱(box)和拆箱(unbox)。更多有关两类CTS类型转换的内容将在第10章中介绍。

    图 1-5

  • CLS

    .NET下的语言不仅仅存在数据类型的不同,语言规范上也有显著的区别,公共语言规范(CLS)就是为了解决这个问题而诞生的。

    CLS是一种最低的语言标准,它制定了以.NET平台为目标的语言所必须支持的最小特征,以及某一语言与其他.NET语言之间实现互操作所需要的完备特征。凡是遵守这个标准的语言,在.NET框架下都可以实现互相调用;不符合公共语言规范的代码就不能被其他语言调用,继而不能与其他语言进行互操作。

    比如在C#中,变量命名是区分大小写的,而VB.NET却不区分大小写,这样CLS就规定,编译后的IL代码除了大小写之外必须还有其他的不同。图1-6很好地演示了两者之间的区别。

    图 1-6

2. .NET Framework

.NET Framework类库就是一组DLL程序集的集合,其中包含了大量定义好的类型,这些类型都公开了一些功能。我们可以使用这些公开的功能开发出多种应用程序,例如前面介绍的Windows Forms和ASP.NET应用程序。

由于FCL中包含了数量极多的类型,因此有必要将相关的一组类型放到一个单独的命名空间中加以区分,例如System.IO命名空间中就包含了用于执行I/O操作的类型。因此,在使用FCL中某个类时,还必须知道该类所在的命名空间。

图1-7可以帮助大家更好地理解公共语言运行时、类库与应用程序之间以及与整个操作系统之间的关系。

图 1-7

1.2.2 C#与.NET Framework的关系

C#是面向.NET Framework的语言,除了C#之外,VB.NET和F#也都是面向.NET Framework的语言。.NET Framework为这些语言提供了执行环境,这些语言则可以调用.NET Framework所提供的类库来开发各种应用程序。大家可以通过图1-8更好地理解两者之间的关系。

图 1-8

1.2.3 C#代码的执行过程

在Visual Studio开发工具下,我们只需要按F5就可以编译和执行C#代码了,但是C#代码到底是如何执行的呢?为了使C#代码能够运行,必须将其转换为目标操作系统能够理解的语言,即本机代码(native code)。在.NET Framework平台下,该过程包括两个阶段。

  • C#代码编译为中间语言代码的阶段——在编译C#代码时,并不是立即创建专用于操作系统的本机代码,而是由C#编译器(Visual Studio中集成了C#编译器)把代码编译为通用中间语言(Common Intermediate Language,CIL)代码。

  • 中间语言代码编译为本机代码的阶段——要使C#代码能够运行,还需进一步将CIL代码转换为特定CPU的本机代码,该过程由即时编译器(Just-In-Time,JIT)来完成。

下面详细介绍C#代码的编译和执行过程。

1. C#代码编译为中间语言代码阶段

并不是只有C#代码才能被编译为中间语言代码,其他面向.NET的语言(如VB .NET)在执行之前也都需要先编译为中间语言代码。该过程由对应的编译器去完成,具体过程如图1-9所示。

最终创建的IL代码将存储在一个程序集中,程序集中除IL代码外,还将包括元数据和可选的资源文件。元数据用来描述代码中的类型,这种描述针对3个方面:类型定义的描述、类型成员的描述和类型引用成员的描述。可选的资源文件指IL代码中使用的其他数据,如图片文件等。

图 1-9

程序集分为两种:扩展名为.exe的可执行文件,以及扩展名为.dll的可供其他程序调用的库文件。

2. 中间语言代码编译为本机代码阶段

为了使IL代码能够运行,必须把它编译为本机代码,即CPU指令。这个过程由CLR的JIT编译器来完成。其编译过程如图1-10所示。

图 1-10

3. 执行本机代码

JIT编译生成本机代码之后,编译好的本机代码会被放置到一个缓冲区中缓存,下次再调用相同的代码时,可直接运行缓冲区中现有的本机代码,从而避免重新验证IL代码以及把它编译为本机代码的过程。使用这种方法,系统只在首次调用时才会造成一些性能损失(即发生JIT过程)。

1.3 归纳总结

本章简单介绍了C#语言的特点和发展历程,阐释了.NET Framework与C#之间的关系,并给出了C#代码的执行过程。相信通过本章的学习,你已经对C#有了一个全面的认识。下一章将带领大家创建一个简单的控制台程序。

from: http://www.ituring.com.cn/book/tupubarticle/9043

Learning hard C#学习笔记 C#简介相关推荐

  1. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  2. RNN学习笔记(一)-简介及BPTT RTRL及Hybrid(FP/BPTT)算法

    RNN学习笔记(一)-简介及BPTT RTRL及Hybrid(FP/BPTT)算法 本文假设读者已经熟悉了常规的神经网络,并且了解了BP算法,如果还不了解的,参见UFIDL的教程. - 1.RNN结构 ...

  3. Deep learning with Python 学习笔记(6)

    本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...

  4. OptiX资料学习笔记1——简介

    OptiX资料学习笔记1--简介 OptiX引擎的现状 目前有三种开源的API支持NVIDIA的光线追踪功能,分别为: DirectX Raytracing (DXR) DX的光线追踪API Vulk ...

  5. PCL学习笔记-PCL简介

    PCL(点云库)学习笔记 1.简介 点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库). PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点 ...

  6. 51单片机学习笔记1 简介及开发环境

    51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...

  7. Python学习笔记一简介及安装配置

    Python学习笔记一 参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e54 ...

  8. Computer vision: models, learning and inference 学习笔记1:引言

    学习笔记1:引言 目的 model,learning and inference 的含义 独特之处:基于模型的知识结构体系 最关键的是:模型(model) 目的 学习<computer visi ...

  9. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

最新文章

  1. java延迟函数_Java 8:延迟计算
  2. 「Apollo」直接在docker内部安装miniconda失败
  3. python root什么意思_root是什么意思
  4. stl min函数_std :: min_element()函数以及C ++ STL中的示例
  5. 解决Mac装上Jetbrain系列软件(Pycharm/Idea)破解包无效导致软件启动报错
  6. ambari安装中常见的问题
  7. VMware 安装 CentOS 7
  8. WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片
  9. netbeans运行KEmulator
  10. 测试用例设计方法_等价类划分法(游戏向)
  11. 2021-09-10 网安实验-文件修复-BMP图片隐写
  12. SAP PO的结算状态
  13. 纹理压缩(二) ETC格式
  14. Comparable+Comparator+Cloneable接口
  15. 02.docker镜像的区别--Alpine、Slim、Stretch、Buster、Jessie、Bullseye
  16. layui列表显示缩略图_layui 表格中实现照片预览,点击查看原图
  17. 离散实验偏序关系满足实验报告C语言,离散数学实验三
  18. VS2019安装(含免费安装包)
  19. 【2021版PHP高级教程-Swoole4.X从入门到精通全套高级实战】
  20. GNSS相关名词介绍

热门文章

  1. 李宏毅深度学习——第一天(Bias and Variance)
  2. C实现socket编程
  3. 华为将操作系统“装入”海尔
  4. 可视化自编码器训练结果
  5. Java学习笔记(四)--数据类型与运算符
  6. MySQL 实现一个字段赋值给另一个字段
  7. MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?
  8. vb.net限制datagridview不能选择_家里安装200兆宽带,网速还是很慢怎么办?教你一招解除网速限制...
  9. 解决IDEA2020.1版本不兼容Lombok的问题
  10. 山西财经大学计算机考试题及答案,2018年山西财经大学计算机应用技术408计算机学科专业基础综合之计算机操作系统考研基础五套测试题...