Learning hard C#学习笔记(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-01 10:30:05

点击下载

作者:李志

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Learning hard C#学习笔记

Learning hard C#学习笔记试读:

前言

大家能看到这本书,我觉得十分欣慰。这本书历时一年才完成,期间经历了很多兴奋、沮丧和喜悦。我以前并不喜欢学习,也从未买过一本技术图书。但是后来经过几轮面试失败之后,我觉得自己不能再这么下去了,既然选择了做程序员,就应该做好。当时,有很多论坛和朋友都推荐CLR Via C#一书,于是我就尝试买来看看,以此来提升自己。看着看着,我发现以前很多不理解的知识点和面试中遇到的问题大部分都在书中找到了答案,这一下子激发了我心中对知识的渴望,花了一个月的时间就把这本书看完了。看的过程中,遇到不了解的知识点我就通过阅读一些文章来帮助自己理解,这些文章大部分来自博客园。这不仅让我了解了博客园,而且让我觉得分享博文其实是一个很好的总结过程,渐渐地我也开始写一些博文来总结自己学习的过程。让我没想到的是,文章发布之后得到了很多园友的支持和鼓励,这让我动力倍增,正式开始了我的博客园之旅。由于我的每篇博文都真实、准确地反映了自己的学习过程,所以在博客园的反响还不错,好几篇博文都登上了48小时阅读排行榜。后来,图灵的编辑找到了我,问我有没有意愿写一本介绍C#基础的图书。我听到这个消息自然是万分喜悦,而喜悦之后迎来的是担心,担心写得不好误导了大家,担心自己不能坚持下去。不过回过头想想,自己写博文不就是希望初学者少走弯路吗?如果能写成书,一来可以帮助其他刚入行的开发人员,二来对自己也是很好磨练和积累。这样,就有了你手上捧着的这本书了。

这本书中的每章都是我本人学习提高的亲身经历,读者若能按照书中的内容来学习,肯定可以很好地掌握C#语言,这也有助其他语言学习的快速上手。我自己就是一个例子,我后来自学C++语言之后,发现C++很多内容和C#语言是相通的,不同的是解决问题提供的API不同罢了。所以,我希望本书是你进入C#殿堂的第一本书,学完这本书之后,我相信你也会像我一样渴望获得更多的知识,从此就Learning hard(我的博客园昵称)了。

本书结构

本书一共分为23章。首先介绍了C#语言的发展史、语法和面向对象等基础内容,接着系统地介绍了C# 1.0到C# 5.0中的所有核心特性,最后通过三个实例来巩固所学的内容。

第1章介绍了C#语言的发展历程、.NET Framework的一些基础概念,以及C#与.NET Framework之间的关系和C#代码的执行过程。通过本章,读者可以对C#语言和微软.NET平台有一个大致的认识,为后续章节做了一个很好的铺垫。

第2章介绍了C#环境的搭建和一个简单的控制台程序,通过本章,读者可以对C#创建的应用程序有一个清晰的认识。

第3章详细介绍了C#基本的语法,包括C#语言中的关键字、数据类型、运算符、表达式和语句等内容。这些内容与其他语言都是相通的。

第4章介绍了C#中的类,主要介绍了类的组成和实例化的过程。

第5章和第6章介绍了面向对象编程。通过本章读者将了解到面向对象的三要素:封装、继承和多态,以及接口的定义和实现。不过,本章并没有涵盖面向对象编程的所有内容,要想深入理解面向对象编程的思想,读者还需要项目的磨练和进一步的研究学习。

第7章介绍了IL语言。IL语言可以说是深入学习C#语言的最佳途径,通过本章,读者将了解到查看IL语言的工具和如何看懂IL代码。

第8章到第20章详细介绍了C# 1.0到C# 5.0中所有的核心特性。这些主要特性包括委托、事件、泛型、可空类型、匿名方法、扩展方法、Lambda表达式、扩展方法和async关键字等。读者通过这部分内容将清楚地明白C#语言的更新情况,对自己写的代码不再陌生。

第21章介绍了在开发过程中会经常涉及的文件操作。

第22章介绍了网络编程所需要的一些基础概念。通过本章读者可以了解网络通信的原理,以及学会如何实现类似QQ的通信程序。

第23章介绍图形编程的相关内容。通过本章的学习,读者可以自行实现类似QQ截图的截图工具。

另外,C# 6.0预览版已经面世,由于仍是预览版,有些特性还不确定正式版是否会添加,所以本书并没有对C# 6.0的特性作相关介绍。好在预览版中更新的特性相对简单,这里给出相关链接,读者可以自行学习。

https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status

http://msdn.microsoft.com/zh-cn/magazine/dn683793.aspx

http://www.cnblogs.com/henryzhu/p/new-feature-in-csharp-6.html

目标读者

本书不仅包括了一些C#基础语法,而且系统地介绍了C# 1.0到C# 5.0的所有核心特性,最后还通过3个实例程序来巩固所学的知识。所以本书非常适合初学者进行系统地学习,同时也适合想系统学习C#的初级工程师。

学习这本书不要求你之前有任何C#基础,但是你最好学习过一门编程语言,如C语言等。阅读本书时,如果你之前已经接触过C#语言的基础语法,你可以根据自身情况来有选择地阅读。如果你之前完全没有接触C#的话,建议你从第1章循序渐进地学习,这样有利于系统地掌握C#。最后,需要特别注意的一点就是,在学习过程中,对于书中的例子,一定要亲自敲一遍,即使有源码也要自己去敲。

勘误及源码下载

由于作者水平有限,书中难免会出现一些错误或者不准确的地方。如果你在学习过程中发现了错误或者有所疑问,请在图灵社区本书页面(http://www.ituring.com.cn/book/1604)提交勘误,也可以直接联系我。博客地址:http://www.cnblogs.com/zhili/。书中所有源码都可以在图灵社区本书页面“随书下载”中下载。

致谢

最后,我还想感谢我的家人、女朋友和一直支持我的人,正是因为他们的理解和支持,才使我有了动力和坚持的心,真心谢谢大家!

 第 1 章|chapter 01你真的了解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 Visual 发特性# FramewStudio版本布版ork版本日本期C.NET Visual 20# FramewStudio .02委托事件1.ork 1.0NET 2002.10C.NET Visual 20# FramewStudio .03APM1.ork 1.1NET 2003.41Visual Studio C20.NET 泛型2005(开始# 05Framew匿名方法命名为2..ork 2.0迭代器可空类型Visual 011Studio)隐式类型的局部变量对象集合初始化.自动实现属性NET C20匿名类型Framew# Visual 07扩展方法ork 3.03.Studio 2008.查询表达式.NET 011Lambda表达式Framew表达式树ork 3.5分部类和分部方法LinqC动态绑定.NET 20# Visual 命名和可选参数Framew104.Studio 2010泛型的协变和逆变ork 4.0.40互操作性C.NET 20# Visual Framew12异步和等待调用方信息5.Studio 2012ork 4.5.80

从表1-1可以看出,对于C#的每一个版本,微软都是围绕某个主题进行更新的,图1-1更形象地总结了每个C#版本的主题。图 1-11.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)。下面来具体了解这两个组件的功能。● CTSC#和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-71.2.2 C#与.NET Framework的关系

C#是面向.NET Framework的语言,除了C#之外,VB.NET和F#也都是面向.NET Framework的语言。.NET Framework为这些语言提供了执行环境,这些语言则可以调用.NET Framework所提供的类库来开发各种应用程序。大家可以通过图1-8更好地理解两者之间的关系。图 1-81.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#有了一个全面的认识。下一章将带领大家创建一个简单的控制台程序。

 第 2 章|chapter 01来点C#的感觉在介绍C#语言的基本特性之前,让我们来点C#的感觉,通过亲手创建一个简单的控制台程序,叩开C#的大门!控制台应用程序没有图形化的界面,它类似于Windows操作系统中的命令行窗口。2.1开发环境的搭建

用C#语言开发应用程序,首先要搭建好相应的开发环境。学过C语言的人都知道,Turbo C是C语言的开发工具,而Visual Studio 2010(简称VS2010)或者Visual Studio 2010 Express(简称VSE)则是C#语言的开发工具。

与其他语言相比,C#开发环境的搭建过程相当简单。我们只需购买下载Visual Studio 2010的安装包,运行安装包中的Setup.exe可执行文件,然后点击界面中一连串的“下一步”按钮,就可以很方便地搭建起C#的开发环境。下面来看具体的搭建步骤。

(1) 运行安装包中的Setup.exe文件,此时你将看到如图2-1所示的安装界面。图 2-1

(2) 单击图2-1窗体中的“安装Microsoft Visual Studio 2010”,之后你将看到如图2-2所示的安装向导界面。图 2-2

(3) 单击图2-2中“下一步”按钮,打开如图2-3所示的窗体。图 2-3

(4) 继续单击“下一步”按钮,将出现如图2-4所示的选择安装功能界面。此时你可以选择完全安装或者自定义安装模式,如果只想安装Visual C#的开发环境,那就选择自定义安装,勾选掉其他语言。不过,一般选择全部安装模式。图 2-4

(5) 单击“安装”按钮,这样Visual Studio 2010专业版就开始安装了,此时你将看到如图2-5所示的安装过程窗体。此外,Visual Studio除了专业版外,还有旗舰版、高级版和专业测试版等,如需安装其他版本,可自行购买对应的安装包文件。图 2-5

(6) 所有组件安装完成之后,你会看到如图2-6所示的安装完成窗体。图 2-6

(7) 单击完成窗体中的“完成”按钮或右上角的红色关闭按钮,就完成了C#开发环境的搭建。接下来我们就可以利用Visual Studio 2010来创建自己的第一个控制台程序了。2.2创建“欢迎你”应用程序

搭建好开发环境后,让我们一起动手,创建一个用来显示“欢迎你”的控制台程序,初步体验C#的感觉。2.2.1 创建控制台项目

通过VS创建控制台程序的方法非常简单,我们只需依次选择文件→新建→项目等菜单项,然后在弹出的窗口中选择我们想要创建的项目类型就可以了。下面具体介绍创建步骤。

(1) 在VS中依次选择文件→新建→项目等菜单项,如图2-7所示。图 2-7

(2) 在VS显示窗体的“已安装的模板”中选择“Visual C#”节点,然后选择“控制台应用程序”。你可以修改“名称”文本框中的默认文本(项目名称),也可以单击“位置”文本框来指定程序存储的位置。这里我把项目名称修改为WelcomeYou,具体效果如图2-8所示。图 2-8

(3) 单击图2-8中的“确定”按钮。

(4) 在Program.cs文件里添加如下代码:namespace WelcomeYou{ // "欢迎你"的控制台程序 class Program { static void Main(string[] args) { // 定义输出文本变量 string welcomeText = "欢迎你"; // 输出文本到控制台 Console.WriteLine(welcomeText); // 让控制台程序可见,直到用户按下任意字符为止 Console.ReadKey(); } }}

经过上面的步骤后,你就完成了自己第一个控制台程序的创建。接下来,需要做的事情就是使上面的代码运行起来。2.2.2 编译和运行程序

在第1章中,我为大家介绍了C#代码运行起来需要经过两个阶段。

第一个阶段:将C#代码编译生成包含CIL代码的DLL或EXE文件。

第二个阶段:将CIL代码编译生成本机代码。

在这里,我将先后通过两种方式将C#代码编译成CIL代码,它们分别为:通过Visual Studio 2010编译和运行,以及通过命令行编译和运行。

1. 通过Visual Studio 2010编译和运行

在Visual Studio 2010中,可以有3种方式去编译和运行一段程序。● 单击“调试”菜单,选择“启动调试”菜单项,或选择“开

始执行”(不调试)菜单项,如图2-9所示。图 2-9● 单击工具栏上的“启动调试”按钮直接运行,如图2-10所示。图 2-10● 直接按F5快捷键来启动调试和运行,或按Ctrl+F5快捷键来

只启动运行但不进行调试。

上面介绍了两种启动程序的方式,分别为启动调试(对应快捷键是F5)和运行但不启动调试(对应快捷键是Ctrl+F5)。它们的区别是:前者允许在运行过程中中断,并进行单步执行,这样就可以通过在源码中设置断点来进行单步调试,以此来查看变量的值;后者仅仅编译并运行,无法对程序进行调试。

在程序开发过程中,用到最多的是启动调试的方式,因为这样我们可以通过单步调试来发现程序出错的地方。

按F5快捷键运行你的控制台程序,你将看到如图2-11所示的运行结果。图 2-11

从图2-11中可以看出,程序输出结果与代码中要实现的预期结果一样,从而确认程序的正确性。

2. 通过命令行编译和运行

除了上面介绍的方式外,你还可以通过命令行的方式来对C#代码进行编译。你可以依次单击开始→所有应用程序→Microsoft Visual Studio 2010→Visual Studio Tools→Visual Studio 2010(2010)来打开命令行窗口,然后在打开的命令行窗口中,输入如下命令:csc /out:D:\WelcomeYou.exe E:\图书\CSharp\Chapter02\WelcomeYou\WelcomeYou\Program.cs

输入完成后,按下Enter键来执行命令。命令执行成功后你将看到如图2-12所示的结果,并且在D盘根目录下,将生成WelcomeYou.exe可执行文件。图 2-12

csc.exe的语法为:csc [options] sourceFiles

其中sourceFiles是一个或多个C#源文件所在的位置。表2-1列出了csc.exe的一些常用命令选项,更多的命令选项可通过在命令行中输入csc /?来查看(如图2-13所示),也可以在MSDN中进行查看,链接为http://msdn.microsoft.com/zh-cn/library/6s2x2bzy(v=vs.100).aspx。表 2-1 csc.exe的常用命令选项选项说明/out:filename指定输出文件名称/target:exe创建.exe文件,这也是默认选项/target:library创建.dll类库文件/target:创建可以添加到另一程序集的模块module/target:winexe创建Windows可执行程序/platform:指定可以运行的平台,srting可以为x86、x64、Itaniumstring或anycpu(默认值)图 2-132.2.3 对程序进行调试

对于开发者来说,调试程序的能力是不可或缺的。当程序出现错误时,我们需要对程序进行调试来发现代码中存在的问题,继而通过修改代码来解决问题。下面详细介绍程序调试的方法。

利用Visual Studio 2010进行程序调试的步骤如下。

(1) 在需要调试的C#代码中设置断点,方法为:单击代码行的最前面来设置断点。设置成功后,你将看到如图2-14所示的效果。图 2-14

(2) 按F5启动调试运行程序,程序在运行到设置断点的位置时会暂停运行,你将看到如图2-15所示的效果。注意,此时断点位置的代码并没有执行。图 2-15

(3) 按F10或F11来单步执行代码。

按F10与按F11的区别在于:当中断的代码行是方法时,按F10不会进入方法的定义中进行单步执行,而是直接跳过方法中的代码,直接执行方法下一行的代码;而按F11则会进入到方法的定义中单步执行。

在调试期间,可以通过监视窗口来查看变量的值,还可以调用栈窗口来查看程序的调用过程,如图2-16所示。其中,最有用的信息就是栈窗口中的调用过程信息:程序在运行过程中可能会遇到程序崩溃的情况,此时可以通过查看调用栈来确定出错的位置,再通过监视窗口确定具体是由哪个变量引起的错误,从而确定程序出错的原因。图 2-162.3归纳总结

本章带领大家创建了一个控制台程序,并通过该程序阐述了编译和执行程序的方法,最后给出了调试应用程序步骤。通过本章的内容,大家已经对如何编写C#代码和如何调试程序有了一个初步的认识。在下一章中,我将为大家详细地介绍C#语言的基础知识。

 第 3 章|chapter 01打开C#的大门——C#语言基础在第2章中,我们通过一个简单的“欢迎你”控制台程序,已经学习了如何创建程序,并初步了解了C#代码的编写、编译和调试过程。但上一章并没有对C#语言的语法细节进行过多的讨论,所以接下来,我们将以第2章中的C#源码为例,介绍C#语言基础。3.1标识符和关键字

只要是语言,就会有标识符和关键字的概念。C#中的标识符和关键字,与C语言中的非常类似,如果你有C语言基础,那么掌握C#的标识符和关键字也自然不在话下。3.1.1 标识符

下面通过分析第2章中的C#源码,引出C#中标识符的概念,请看代码清单3-1。

代码清单 3-1using System;namespace WelcomeYou{ //"欢迎你"的控制台程序 class Program { static void Main(string[] args) { // 定义输出文本变量 string welcomeText = "欢迎你"; // 输出文本输出到控制台 Console.WriteLine(welcomeText); // 让控制台程序可见直到用户按下任意字符为止 Console.ReadKey(); } }}

在代码清单3-1中,字符串WelcomeYou、Program、Main、args和welcomeText都是标识符,可以看出——标识符就是一种特定的字符串,你可以使用标识符来对命名空间、类、方法、参数和局部变量进行命名。但这并不意味着所有的字符串都可用作标识符,在C#中,一个字符串要成为标识符必须满足以下几个条件:● 只包含字母(包括大小写)、数字、@符号以及下划线“_”。● 首位可以为字母、下划线和@符号,但不能是数字。● 不能为C#关键字。

例如字符串welcome、hello和@hello都可以作为标识符,但字符串12和hello#却不行,因为字符串12的首位是数字,而字符串hell0#则包含了非法字符#,它们都不符合C#作为标识符的条件。

同时,C#是一种大小写敏感的语言。即使两个字符串由相同的字母组成,但只要大小写存在差异,它们就代表两个不同的标识符,如hello与Hello。

此外在定义标识符时,还应尽可能地保证其意义,使其具有一定的自描述性,即一看到这个标识符立刻就能明白它的用途。如代码清单3-1中的标识符welcomeText,就是一个很好的“见名知意”的例子。3.1.2 关键字

前面曾讲到,C#中的关键字不能作为标识符存在。在代码清单3-1中, using、namespace、class、static和string都是关键字(也称保留字)。C#共有77个关键字,如表3-1所示。

一般情况下,关键字不能用作标识符,但添加@前缀后就没有了这种限制。例如@using就可以作为标识符,而using却不可以,因为using是关键字。表 3-1 C#的77个关键字asbytecaseabstractbaseboolbreakcatchcharcheckedclassconstcontinuedecimaldelegateenumdefaultdodoubleelseeventexplicitfinallyexternfalsefixedfloatforgotoimplicitforeachifinintinterfacenamespalongnewinternalislocknullceparamsobjectoperatorprivateprotectedoutoverridepublicreadonlysbyterefreturnsealedshortstringsizeofstackallocstaticstructswitchthisunchecktrytypeofulongthrowtrueunitedusingunsafeushortvirtualvoidvolatilewhile3.2基础数据类型

在第1章中我们介绍过,公共语言运行时(CLR)包括通用类型系统(CTS)和公共语言规范(CLS)两部分。而通用类型系统又把类型分为两大类:值类型和引用类型。C#是基于.NET框架的语言,它自然定义了自己的数据类型,它们包括数值类型、布尔类型、字符串类型、枚举类型、结构体类型和数组类型。3.2.1 数值类型

C#中的数值类型又分为整型、浮点型和十进制型3种,如图3-1所示。图 3-1

1. 整型

不同的整数类型会占用大小不同的内存空间(至多64位),所能表示的数值范围也不尽相同。我们只有知道了每种类型的取值范围,才可能正确地使用它们,表3-2显示了各类整型数据的大小和取值范围。表 3-2 整型数值的取值范围和内存大小类说明取值范围型byt无符号的8位整8-1)0到255(即2e数sby有符号的8位整-128到127te数cha16位Unicode字U+0000到U+FFFF,例如字符“x”对应的r符Unicode编码为“\0041”sho有符号16位整1515到2-1)-32 768到32 767(即-2rt数ush无符号16位整16-1)0到65 535(即2ort数有符号32位整3131int到2-1-2数无符号32位整32uint-10到2数lon有符号64位整6363到2-1-2g数ulo无符号64位整64-10到2ng数

在表3-2中,某些类型前面的“u”是unsigned(无符号)的缩写,表示不能在这些类型的变量中存储负数。

2. 浮点型

浮点型分为单精度浮点数(float)和双精度浮点数(double),它们的取值范围如表3-3所示。表 3-3 浮点型数值范围与精度类型大小精度大致范围3838float32位7位到+3.4×10-3.4×10-324308double64位15到16位到±1.7×10±5.0×10

3. 十进制型

十进制类型(关键字为decimal)表示128位的数据类型。与浮点数相比,它具有更高的精度和更小的范围,适用于财务和货币的计算。十进制类型的精度和范围如表3-4所示。表 3-4 十进制类型的精度和范围类型精度大致范围28280 - 28decimal28到29位有效位-到7.9×10) / (10)(-7.9×10

如果想实数被视为十进制类型,请加后缀m或M,如下所示:decimal money = 500.3m;3.2.2 布尔类型

布尔类型(bool)用于存储布尔值true和false。可以直接把布尔值赋给bool变量,也可以将计算结果为布尔类型的表达式赋给bool变量(有关表达式的内容将在3.4节介绍),下面的代码演示了布尔类型的使用方法:static void Main(string[] args) { // 直接把布尔值赋给bool变量 bool isoverSpeed = false; int speed = 80; // 把计算结果为bool类型的表达式赋给bool变量 isoverSpeed = speed > 100; if (isoverSpeed) { Console.WriteLine("你已超速,为了你的安全请减速"); } }3.2.3 字符串类型

string(字符串)类型是System.String的别名,表示由零个或多个Unicode字符组成的不可变序列。可使用“[]”运算符访问string中的每个字符。

string类型具有不可变性,下面通过具体例子来进行分析,相关代码如下:static void Main(string[] args) { // 声明并初始化string类型变量 string welcomeText = "hello"; // 对string变量重新赋值 welcomeText = "Hi"; }

这里,在把Hi字符串赋给string变量welcomeText之前,内存首先会重新初始化一块区域,并把该区域的值初始化为Hi。之后,这块内存的地址将赋给变量welcomeText,而原来存放hello的内存区域则不会被修改。可以看出,string类型具有不可变性。

string类型为引用类型,string变量本身存储在栈中,而变量所指向的值则存储在托管堆里。更详细的内容请参考第10章——深入理解类型。

为了帮助大家更好地理解string类型的不可变性,图3-2演示了上面代码中变量的内存分布情况。图 3-23.2.4 枚举类型

枚举类型属于值类型,它用于声明一组命名了的常数。例如若你需要定义一个变量来存储人的性别,那么该变量中将只会包含两个有意义的值,此时就可以使用枚举类型,具体的定义过程如代码清单3-2所示。

代码清单 3-2// 性别枚举enum Gender{ // 女 Female, // 男 Male}

枚举类型使用enum关键字来完成声明。默认情况下,枚举中的每个元素都是int类型。用户可通过使用冒号,制定一种全新的整数值类型,方法如下面的代码所示。// 性别枚举enum Gender:byte{ // 女 Female, // 男 Male}

如果未在枚举列表中指定元素的值,则默认会将所声明的第一个枚举成员设为0,之后的枚举成员依次加1。因此在代码清单3-2中,Gender.Female的值为0,Gender.Male的值为1。3.2.5 结构体类型

C#中的结构体是一种值类型,通常适用于表示诸如Point、Rectangle和Color等的轻量级对象。结构体的定义如下面的代码所示。// 定义点结构体public struct Point{ public int x; public int y; public Point(int px, int py) { x = px; y = py; }}

结构体与类有着几乎相同的语法,这里将不会对其进行展开介绍。大家可以参考第4章有关类的内容,对比着学习结构体。第4章还详细介绍了二者的区别。3.2.6 数组类型

数组是一种引用类型,它代表了相同类型元素的集合。下面的这行代码用于声明和初始化一个数组:type[] array=new type[arrayCount];

这里,type为数组元素的类型,既可以是值类型,也可以是引用类型。声明数组时还需注意,方括号[]应放在类型type后,变量名array前,这和C语言有所不同。

可使用下面的方法访问数组的元素:type elementValue =array[index];

这里的index是数组的小标,它是从0开始,最大不能超过数组的长度减1。如果index超出了这个范围,程序会在运行时出现IndexOutOfRangeException异常。代码清单3-3演示了数组的使用。

代码清单 3-3using System;namespace ArrayUse{ class Program { static void Main(string[] args) { // 声明并初始化一个含有5个元素的int数组 int[] array = new int[5]; // 对数组进行遍历 for (int index = 0; index <= array.Length - 1; index++) { // 输出数组中的值 Console.WriteLine(array[index]); } // 等待用于输入的字符而退出程序 // 这行代码使程序在运行结束后不会直接退出,让读者看到运行结果 Console.ReadLine(); } }}

按F5运行程序,你将看到如图3-3所示的运行结果。图 3-3

代码清单3-3声明并初始化了一个名为array的数组,但并没有为其元素赋值。从程序的运行结果可以得出——当我们未对数组元素进行显式赋值时,对于int类型的数组,编译器会自动地将所有的元素设置为默认值0。

其他类型的默认值,大家可参考代码清单3-3自行试验。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载