C从入门到实践

上传人:cl****1 文档编号:567629260 上传时间:2024-07-21 格式:PPT 页数:522 大小:3.42MB
返回 下载 相关 举报
C从入门到实践_第1页
第1页 / 共522页
C从入门到实践_第2页
第2页 / 共522页
C从入门到实践_第3页
第3页 / 共522页
C从入门到实践_第4页
第4页 / 共522页
C从入门到实践_第5页
第5页 / 共522页
点击查看更多>>
资源描述

《C从入门到实践》由会员分享,可在线阅读,更多相关《C从入门到实践(522页珍藏版)》请在金锄头文库上搜索。

1、C#从入门到实践从入门到实践第第1 1章章 C# C#入门根底入门根底Microsoft公司是这样描述公司是这样描述C#的:的:“C#是从是从C和和C+派生来派生来的一种简单、现代、面向对象和类型平安的编程语言。的一种简单、现代、面向对象和类型平安的编程语言。C#读做读做Csharp主要是从主要是从C/C+编程语言家族移植编程语言家族移植过来的,过来的,C和和C+的程序员会马上熟悉它。的程序员会马上熟悉它。C#试图结合试图结合Visual Basic的快速开发能力和的快速开发能力和C+的强大灵活的能力。的强大灵活的能力。本章将讲解使用。本章将讲解使用C#语言开发的入门知识,主要介绍语言开发的入

2、门知识,主要介绍以下知识点。以下知识点。.NET Framewrok;搭建搭建Visual Studio 2021开发环境;开发环境;创立第一个控制台应用程序;创立第一个控制台应用程序;创立第一个创立第一个Windows窗体应用程序。窗体应用程序。C#从入门到实践从入门到实践1.1 C#1.1 C#概述概述C#是一种简单的、现代的、面向对象的、类型平安的编程是一种简单的、现代的、面向对象的、类型平安的编程语言。它不但提供了面向对象编程的技术,而且还提供语言。它不但提供了面向对象编程的技术,而且还提供了面向组件编程的支持技术。了面向组件编程的支持技术。Visual C# 2021提供了许多提供了

3、许多方便开发的工具,如高级代码编辑器、方便的用户界面方便开发的工具,如高级代码编辑器、方便的用户界面设计器、集成调试器等。开发人员使用这些工具,可以设计器、集成调试器等。开发人员使用这些工具,可以更容易在更容易在C#语言版和版的根底上开发应用程序。语言版和版的根底上开发应用程序。C#从入门到实践从入门到实践1.1.1 C#1.1.1 C#语言语言C#是一种是一种Microsoft公司设计的、简洁的、类型平安的、面公司设计的、简洁的、类型平安的、面向对象的语言,它松散地基于向对象的语言,它松散地基于C/C+语言,并且有很多语言,并且有很多方面和方面和Java语言类似。开发人员可以使用语言类似。开

4、发人员可以使用C#语言来构建语言来构建在在.NET Framework上运行的各种平安、可靠的应用程序。上运行的各种平安、可靠的应用程序。C#语法表现力强、简单易学、容易上手。通常地,开发人语法表现力强、简单易学、容易上手。通常地,开发人员通过很短的时间的学习,就能够使用员通过很短的时间的学习,就能够使用C#语言开发高效语言开发高效的程序。的程序。C#语法提供了许多强大的功能,如可为空置语法提供了许多强大的功能,如可为空置null的值类型、枚举、委托、的值类型、枚举、委托、lambda表达式、直接内表达式、直接内存访问等。存访问等。C#支持泛型类型和方法,进而提供了更为出支持泛型类型和方法,进

5、而提供了更为出色的类型平安和性能。特别地,色的类型平安和性能。特别地,C#还提供了迭代器、语还提供了迭代器、语言集成查询言集成查询LINQ表达式等高级功能,使得开发人表达式等高级功能,使得开发人员可以在员可以在C#代码中创立具有查询功能的程序代码。代码中创立具有查询功能的程序代码。C#从入门到实践从入门到实践1.1.2 .NET1.1.2 .NET框架框架C#程序必须在程序必须在.NET Framework上运行。上运行。.NET Framework是是Windows的一个不可或缺的组件,是一个支持构建、部署和的一个不可或缺的组件,是一个支持构建、部署和运行下一代应用程序和运行下一代应用程序和

6、Web效劳的完整效劳的完整Windows组件。组件。.NET Framework能够提供效率极高的、基于标准的多语言如能够提供效率极高的、基于标准的多语言如C#、C+、J#等环境,能够将现有的应用程序与下一代应用等环境,能够将现有的应用程序与下一代应用程序和效劳集成,并能迅速部署和操作程序和效劳集成,并能迅速部署和操作Internet规模的应用程规模的应用程序。序。.NET Framework主要包括两个组件:公共语言运行库主要包括两个组件:公共语言运行库Common Language Runtime,简称为,简称为CLR和和.NET Framework类库类库Class Library。1公

7、共语言运行库公共语言运行库2.NET Framework类库类库3公共语言运行库、公共语言运行库、.NET Framework类库和应用程序的关系类库和应用程序的关系4语言互操作性语言互操作性5C#应用程序执行流程应用程序执行流程C#从入门到实践从入门到实践1.1.3 C#1.1.3 C#应用程序应用程序C#应用程序包括两种应用程序:控制台应用程序包括两种应用程序:控制台Console应用程应用程序小节创立的应用程序就是一个控制台应用程序和序小节创立的应用程序就是一个控制台应用程序和Windows窗体应用程序小节创立的应用程序就是一个窗体应用程序小节创立的应用程序就是一个Windows窗体应用

8、程序。控制台应用程序的界面往往窗体应用程序。控制台应用程序的界面往往比较简单,而比较简单,而Windows窗体应用程序能够提供丰富的图窗体应用程序能够提供丰富的图形界面。形界面。1控制台应用程序控制台应用程序2Windows窗体应用程序窗体应用程序C#从入门到实践从入门到实践1.2 1.2 搭建搭建Visual Studio 2021Visual Studio 2021开发环境开发环境本小节介绍搭建开发本小节介绍搭建开发C#应用程序如应用程序如Windows窗体应用程窗体应用程序、网站等的环境,包括安装序、网站等的环境,包括安装Microsoft Visual Studio 2021、配置集成

9、开发环境、配置集成开发环境IDE、熟悉集成开发环境、熟悉集成开发环境IDE等内容。等内容。注意:笔者机器的操作系统为注意:笔者机器的操作系统为Microsoft Windows Server 2003 Enterprise Edition Service Park 2。C#从入门到实践从入门到实践1.2.1 1.2.1 安装安装Microsoft Visual Studio 2021Microsoft Visual Studio 2021下面介绍在笔者机器上安装下面介绍在笔者机器上安装Microsoft Visual Studio Team System 2021简体中文版的操作步骤,具体如下

10、。简体中文版的操作步骤,具体如下。C#从入门到实践从入门到实践1.2.2 1.2.2 配置集成开发环境配置集成开发环境IDEIDE由于由于Microsoft Visual Studio 2021集成开发环境集成开发环境IDE非非常复杂,为了以后能够更加方便地开发各种常复杂,为了以后能够更加方便地开发各种C#应用程序,应用程序,在此,特意详细介绍配置在此,特意详细介绍配置Microsoft Visual Studio 2021集集成开发环境的方法。成开发环境的方法。C#从入门到实践从入门到实践1.2.3 1.2.3 熟悉集成开发环境熟悉集成开发环境IDEIDEMicrosoft Visual S

11、tudio 2021集成开发环境包括多个可以停集成开发环境包括多个可以停靠或浮动的面板,如靠或浮动的面板,如“工具箱、工具箱、“效劳器资源管理器效劳器资源管理器、“解决方案资源管理器、解决方案资源管理器、“属性等面板。属性等面板。C#从入门到实践从入门到实践1.3 1.3 创立第一个控制台应用程序创立第一个控制台应用程序本节介绍使用本节介绍使用Microsoft Visual Studio 2021集成开发环境集成开发环境IDE创立第一个控制台应用程序创立第一个控制台应用程序Sample_01_CA的的方法,以及开发方法,以及开发Sample_01_CA应用程序所涉及的各种应用程序所涉及的各种

12、根本技术,如编写根本技术,如编写C#代码、运行应用程序等。代码、运行应用程序等。C#从入门到实践从入门到实践1.3.1 1.3.1 创立创立Sample_01_CASample_01_CA控制台应用程序控制台应用程序依次选择依次选择“开始开始|“所有程序所有程序|“Microsoft Visual Studio 2021|“Microsoft Visual Studio 2021命令,翻开命令,翻开“起起始页始页 - Microsoft Visual Studio对话框。单击对话框。单击“最近工最近工程面板中的程面板中的“创立下的创立下的“工程链接,弹出工程链接,弹出“新建新建工程对话框,如下

13、图。工程对话框,如下图。C#从入门到实践从入门到实践1.3.2 1.3.2 解决方案资源管理器解决方案资源管理器创立创立Sample_01_CA控制台应用程序成功之后,控制台应用程序成功之后,Microsoft Visual Studio 2021集成开发环境集成开发环境IDE将为该应用程将为该应用程序创立一个默认类文件,名称为序创立一个默认类文件,名称为“。翻开。翻开“解决方案解决方案资源管理器面板,可以查看资源管理器面板,可以查看Sample_01_CA控制台应控制台应用程序包含的所有资源和数据,如下图。用程序包含的所有资源和数据,如下图。C#从入门到实践从入门到实践1.3.3 1.3.3

14、 文件文件双击双击“解决方案资源管理器面板中的解决方案资源管理器面板中的“节点,翻开文节点,翻开文件。该文件为件。该文件为Sample_01_CA控制台应用程序提供主入控制台应用程序提供主入口点。口点。C#从入门到实践从入门到实践1.3.4 1.3.4 文件文件首先展开首先展开“解决方案资源管理器面板中的解决方案资源管理器面板中的“Properties节点,然后双击节点,然后双击“节点翻开文件。该文件用来配置节点翻开文件。该文件用来配置Sample_01_CA控制台应用程序的程序集信息。控制台应用程序的程序集信息。C#从入门到实践从入门到实践1.3.5 1.3.5 运行应用程序运行应用程序按下

15、按下“F5按钮或者单击按钮或者单击Microsoft Visual Studio 2021集成集成开发环境中的按钮即可运行开发环境中的按钮即可运行Sample_01_CA控制台应用控制台应用程序。该应用程序运行之后,显示一个黑色的控制台对程序。该应用程序运行之后,显示一个黑色的控制台对话框,如下图。话框,如下图。C#从入门到实践从入门到实践1.4 1.4 创立第一个创立第一个WindowsWindows窗体应用程序窗体应用程序本节介绍使用本节介绍使用Microsoft Visual Studio 2021集成开发环境集成开发环境IDE创立第一个创立第一个Windows窗体应用程序窗体应用程序S

16、ample_01_WFA的方法,以及开发的方法,以及开发Sample_01_WFA应应用程序所涉及的各种根本技术,如设计用程序所涉及的各种根本技术,如设计Windows窗体、窗体、编写编写C#代码、配置应用程序、运行应用程序等。代码、配置应用程序、运行应用程序等。C#从入门到实践从入门到实践1.4.1 1.4.1 创立创立Sample_01_WFA WindowsSample_01_WFA Windows窗体应用窗体应用程序程序依次选择依次选择“开始开始|“所有程序所有程序|“Microsoft Visual Studio 2021|“Microsoft Visual Studio 2021命

17、令,翻开命令,翻开“起起始页始页 - Microsoft Visual Studio对话框。单击对话框。单击“最近工最近工程面板中的程面板中的“创立下的创立下的“工程链接,弹出工程链接,弹出“新建新建工程对话框,如下图。工程对话框,如下图。C#从入门到实践从入门到实践1.4.2 1.4.2 解决方案资源管理器解决方案资源管理器创立创立Sample_01_WFA Windows窗体应用程序成功之后,窗体应用程序成功之后,Microsoft Visual Studio 2021集成开发环境集成开发环境IDE将为将为该应用程序创立一个默认该应用程序创立一个默认Windows窗体,名称为窗体,名称为“

18、Form1.cs。翻开。翻开“解决方案资源管理器面板,可解决方案资源管理器面板,可以查看以查看Sample_01_WFA Windows窗体应用程序包含的窗体应用程序包含的所有资源和数据,如下图。所有资源和数据,如下图。C#从入门到实践从入门到实践窗体窗体在在“解决方案资源管理器面板中双击解决方案资源管理器面板中双击“Form1.cs节点,节点,翻开窗体的设计界面,如下图。此时,开发人员可以直翻开窗体的设计界面,如下图。此时,开发人员可以直接将接将“工具箱面板中的控件拖放到工具箱面板中的控件拖放到“Form1.cs窗体窗体上。上。C#从入门到实践从入门到实践文件文件首先展开首先展开“解决方案资

19、源管理器面板中的解决方案资源管理器面板中的“Form1.cs节点,然后双击节点,然后双击“Form1.Designer.cs节点翻开文件。节点翻开文件。该文件中的代码为窗体的设计代码,用来描述窗体上的该文件中的代码为窗体的设计代码,用来描述窗体上的每一个控件。每一个控件。C#从入门到实践从入门到实践窗体的代码窗体的代码右击右击“解决方案资源管理器面板中的解决方案资源管理器面板中的“Form1.cs节点,节点,翻开窗体的代码文件。该文件保存窗体的事件等设计代翻开窗体的代码文件。该文件保存窗体的事件等设计代码。码。C#从入门到实践从入门到实践1.4.6 1.4.6 文件文件双击双击“解决方案资源管

20、理器面板中的解决方案资源管理器面板中的“节点,翻开文节点,翻开文件。该文件为件。该文件为Sample_01_WFA Windows窗体应用程序窗体应用程序提供主入口点。提供主入口点。C#从入门到实践从入门到实践1.4.7 1.4.7 文件文件首先展开首先展开“解决方案资源管理器面板中的解决方案资源管理器面板中的“Properties节点,然后双击节点,然后双击“节点翻开文件。该文件用来配置节点翻开文件。该文件用来配置Sample_01_WFA Windows窗体应用程序的程序集信息。窗体应用程序的程序集信息。C#从入门到实践从入门到实践1.4.8 1.4.8 运行应用程序运行应用程序按下按下“

21、F5按钮或者单击按钮或者单击Microsoft Visual Studio 2021集成集成开发环境中的开发环境中的“按钮即可运行按钮即可运行Sample_01_WFA Windows窗体应用程序。该应用程序运行之后,显示的窗体应用程序。该应用程序运行之后,显示的第一个对话框为第一个对话框为“Form1对话框,如下图。对话框,如下图。C#从入门到实践从入门到实践1.5 1.5 小结小结本章主要介绍了搭建开发本章主要介绍了搭建开发Visual Studio 2021集成开发环境,集成开发环境,以及以及C#语言和语言和.NET Framework的概述。其中,读者要的概述。其中,读者要着重掌握使用

22、着重掌握使用Visual Studio 2021集成开发环境开发第一集成开发环境开发第一个控制台应用程序和个控制台应用程序和Windows窗体应用程序的方法。只窗体应用程序的方法。只有这样,才能进行后续的开发。下一章将要介绍使用有这样,才能进行后续的开发。下一章将要介绍使用C#语言如何编写第一个应用程序。语言如何编写第一个应用程序。C#从入门到实践从入门到实践1.6 1.6 习题习题1在本章介绍的在本章介绍的Sample_01_WFA Windows窗体应用程序窗体应用程序之上,实现以下功能。之上,实现以下功能。1添加名称为添加名称为“的窗体到应用程序中。的窗体到应用程序中。2运行该应用程序。

23、运行该应用程序。C#从入门到实践从入门到实践第第2 2章章 C# C#根本概念根本概念C#语言从版本开展到版本经历了比较长的时间,现在已经语言从版本开展到版本经历了比较长的时间,现在已经是一种比较完善、简单、易学的编程语言。为了读者能是一种比较完善、简单、易学的编程语言。为了读者能够首先对够首先对C#语言有一个简单的认识,笔者特意在本章介语言有一个简单的认识,笔者特意在本章介绍了绍了Hello World应用程序和应用程序和C#语言的一些常见的根本概语言的一些常见的根本概念,主要介绍以下知识点。念,主要介绍以下知识点。创立创立Hello World应用程序;应用程序;编译编译Hello Wor

24、ld应用程序;应用程序;运行运行Hello World应用程序;应用程序;C#程序的概念扩展。程序的概念扩展。C#从入门到实践从入门到实践2.1 2.1 创立创立Hello worldHello world应用程序应用程序对于对于C#初学者而言,初学者而言,Hello world应用程序是应用程序是C#语言入门最语言入门最好的、简单的例如程序。该程序可以在控制台中显示好的、简单的例如程序。该程序可以在控制台中显示“Hello world字符串。下面介绍书写该程序的根本方字符串。下面介绍书写该程序的根本方法。法。C#从入门到实践从入门到实践2.1.1 2.1.1 创立文本文件创立文本文件为了方便

25、初学者真正认识为了方便初学者真正认识C#程序,我们这里不使用集成开程序,我们这里不使用集成开发环境来编写本程序,而是使用记事本来编写程序。新发环境来编写本程序,而是使用记事本来编写程序。新建一个名称为建一个名称为“hello.txt的文本文件,并翻开该文的文本文件,并翻开该文件。件。C#从入门到实践从入门到实践2.1.2 2.1.2 创立创立HelloWorldHelloWorld类类任何一个任何一个C#应用程序都是由类应用程序都是由类class组成。一个组成。一个C#应用应用程序可以包括一个类或多个类。类实际上是对某种类型程序可以包括一个类或多个类。类实际上是对某种类型的对象定义变量和方法的

26、原型。它表示对现实生活中一的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象程序设计类具有共同特征的事物的抽象,是面向对象程序设计Object-Oriented Programming,简称为,简称为OOP的根底。的根底。面向对象程序设计指一种程序设计范型,它将对象作为程面向对象程序设计指一种程序设计范型,它将对象作为程序的根本单元。在面向对象程序设计中,最为根本的概序的根本单元。在面向对象程序设计中,最为根本的概念是类念是类class和对象和对象object,对象又称为实例。,对象又称为实例。1类类2对象对象C#从入门到实践从入门到实践2.1.3 2.1.

27、3 添加添加Main()Main()方法方法一旦创立一个类之后,但是不为该类添加任何成员,那么一旦创立一个类之后,但是不为该类添加任何成员,那么该类就是一个空类,即它不能描述世界上的任何一种对该类就是一个空类,即它不能描述世界上的任何一种对象。为了使得类能够描述一种对象,那么就需要为该类象。为了使得类能够描述一种对象,那么就需要为该类添加一些属性和行为。添加一些属性和行为。一个行为就产生一个动作。在类中,使用方法一个行为就产生一个动作。在类中,使用方法method来描述这一行为。也就是说,方法是一个类能做的事情来描述这一行为。也就是说,方法是一个类能做的事情即一些计算或操作,但是并没有做这事情

28、。作为一即一些计算或操作,但是并没有做这事情。作为一条狗而言,它是会吠叫、会坐下、会吃。因此,为了能条狗而言,它是会吠叫、会坐下、会吃。因此,为了能够使用够使用Dog类描述狗,那么就需要在该类中定义以下类描述狗,那么就需要在该类中定义以下3个个方法。方法。Bark(),吠叫。,吠叫。Sit(),坐下。,坐下。Eat(),吃。,吃。C#从入门到实践从入门到实践2.1.4 2.1.4 调用调用WriteLine()WriteLine()方法方法在在Dog类中,虽然定义了狗的类中,虽然定义了狗的3个行为:吠叫、坐下和吃,个行为:吠叫、坐下和吃,但是并没有使这但是并没有使这3个行为发生。如果想要芊芊这

29、一条狗个行为发生。如果想要芊芊这一条狗吠叫,那么就需要一个主动的动作使得芊芊吠叫。这一吠叫,那么就需要一个主动的动作使得芊芊吠叫。这一个主动的动作就是调用该行为对应的方法,即通过调用个主动的动作就是调用该行为对应的方法,即通过调用方法使得该方法对应的行为发生。方法使得该方法对应的行为发生。C#从入门到实践从入门到实践2.1.5 2.1.5 引入引入SystemSystem命名空间命名空间世界上存在很多狗,而且一些狗的名字也相同。譬如,张世界上存在很多狗,而且一些狗的名字也相同。譬如,张三家的狗叫芊芊,而李四家的狗也叫芊芊。那么如何区三家的狗叫芊芊,而李四家的狗也叫芊芊。那么如何区分这两家的狗呢

30、?自然,称呼张三家的狗可能是分这两家的狗呢?自然,称呼张三家的狗可能是“张三张三家的芊芊,称呼李四家的狗可能是家的芊芊,称呼李四家的狗可能是“李四家的芊芊。李四家的芊芊。通过这种方式,就能够区分张三家和李四家的芊芊了。通过这种方式,就能够区分张三家和李四家的芊芊了。C#从入门到实践从入门到实践2.1.6 2.1.6 整理整理Hello worldHello world应用程序的代码应用程序的代码经过上述步骤之后,就已经书写了一个完整的经过上述步骤之后,就已经书写了一个完整的C#应用程序应用程序Hello world应用程序,它的完整的程序代码如下。应用程序,它的完整的程序代码如下。using

31、System;class HelloWorldstatic void Main()Console.WriteLine(Hello, World);C#从入门到实践从入门到实践2.2 2.2 编译和运行编译和运行Hello WorldHello World应用程序应用程序小节仅仅书写了小节仅仅书写了Hello world应用程序的代码。如果要将这应用程序的代码。如果要将这一段程序代码成为一个可以执行的文件,那么需要使用一段程序代码成为一个可以执行的文件,那么需要使用Microsoft C#编译器编译这一段代码。编译器编译这一段代码。C#从入门到实践从入门到实践2.3 C#2.3 C#程序的概念扩

32、展程序的概念扩展在小节中介绍了在小节中介绍了C#面向对象程序设计的一些根本概念,如面向对象程序设计的一些根本概念,如类、对象、实例、属性、方法、调用方法等。除了上述类、对象、实例、属性、方法、调用方法等。除了上述这些概念之外,还有一些比较常用的概念,如继承性、这些概念之外,还有一些比较常用的概念,如继承性、多态性等。多态性等。1继承性继承性2多态性多态性3接口接口C#从入门到实践从入门到实践2.4 2.4 小结小结本章主要介绍了本章主要介绍了“Hello world应用程序,包括创立应用程序,包括创立Hello World应用程序、编译应用程序、编译Hello World应用程序、运行应用程序

33、、运行Hello World应用程序和分析应用程序和分析Hello World应用程序。其中,读应用程序。其中,读者需要着重掌握使用记事本创立者需要着重掌握使用记事本创立Hello World应用程序的应用程序的方法。下一章将介绍方法。下一章将介绍C#的类型。的类型。C#从入门到实践从入门到实践2.5 2.5 习题习题使用记事本撰写一个名称为使用记事本撰写一个名称为“Test_02的的C#应用程序的应用程序的代码,并将此代码编译为一个名称为代码,并将此代码编译为一个名称为“Test_02.exe的可执行文件。的可执行文件。Test_02应用程序在控制台显示应用程序在控制台显示“This is

34、a C# program.字符串。字符串。C#从入门到实践从入门到实践第第3 3章章 类型类型类型是类型是C#语言中最为根本的概念之一。不同类型的变量将语言中最为根本的概念之一。不同类型的变量将拥有不同的数据存储方式和操作方法。拥有不同的数据存储方式和操作方法。C#语言的类型系语言的类型系统是统一的,它可以把任何类型的值都按照对象来处理。统是统一的,它可以把任何类型的值都按照对象来处理。本章将讲解本章将讲解C#语言中各种类型,主要介绍以下知识点语言中各种类型,主要介绍以下知识点值类型;值类型;引用类型;引用类型;装箱;装箱;拆箱。拆箱。C#从入门到实践从入门到实践3.1 3.1 类型概述类型概

35、述C#语言中的每一个类型都直接或间接派生于语言中的每一个类型都直接或间接派生于object类型,类型,即即object类型是类型是C#语言所有类型的最终基类型。语言所有类型的最终基类型。C#语言语言的类型可以分为以下的类型可以分为以下3种类型。种类型。值类型值类型value-type,它的变量直接包含其数据。,它的变量直接包含其数据。引用类型引用类型reference-type,它的变量只存储对其数据的,它的变量只存储对其数据的引用即访问其数据的访问地址。引用类型的变量又引用即访问其数据的访问地址。引用类型的变量又称为对象称为对象object。指针类型指针类型point-type,和,和C、C

36、+语言中的指针类似,语言中的指针类似,而且只能用作在不平安代码中。由于在而且只能用作在不平安代码中。由于在C#编程中很少使编程中很少使用指针类型,因此,在此不做详细介绍。用指针类型,因此,在此不做详细介绍。C#从入门到实践从入门到实践3.2 3.2 值类型值类型值类型要么是结构类型,要么是枚举类型。值类型的变量值类型要么是结构类型,要么是枚举类型。值类型的变量直接包含其数据,而且其值不可能为直接包含其数据,而且其值不可能为null。在操作值类。在操作值类型的变量时,只会影响该变量的数据,而不会影响另外型的变量时,只会影响该变量的数据,而不会影响另外一个变量的值。所有的值类型都直接或间接派生于一

37、个变量的值。所有的值类型都直接或间接派生于System.ValueType类型。类型。值类型包括结构类型、枚举类型、布尔类型、自定义结构值类型包括结构类型、枚举类型、布尔类型、自定义结构类型、类型、sbyte、byte、char、short、ushort、int、uint、long、ulong、float、double和和decimal类型。其中,类型。其中,C#语言提供了一种被称为语言提供了一种被称为“简单类型简单类型simple type的的预定义结构类型。这些类型通过预定义结构类型。这些类型通过C#保存字标识,如保存字标识,如char、int等。本节将详细介绍值类型的知识点。等。本节将详

38、细介绍值类型的知识点。C#从入门到实践从入门到实践3.2.1 System.ValueType3.2.1 System.ValueType类型类型所有值类型都直接或间接从所有值类型都直接或间接从System.ValueType类隐式继承类隐式继承而来,并且任何类型不能从值类型派生而来。而来,并且任何类型不能从值类型派生而来。System.ValueType本身是一个类,它只包含以下本身是一个类,它只包含以下3个方法。个方法。Equals(),判定当前实例与指定的对象是否相等。,判定当前实例与指定的对象是否相等。GetHashCode(),返回当前实例的哈希代码。该哈希代码用,返回当前实例的哈希

39、代码。该哈希代码用于哈希表一种数据结构的散列运算。于哈希表一种数据结构的散列运算。ToString(),返回当前实例的完全限定类型名称。,返回当前实例的完全限定类型名称。C#从入门到实践从入门到实践3.2.2 3.2.2 整数类型整数类型整数类型包括整数类型包括9种类型,如种类型,如sbyte、byte、short等。它们的具体说等。它们的具体说明、明、.NET Framework中的名称和取值范围如表所示。中的名称和取值范围如表所示。1int类型类型2long类型类型3char类型类型类型描述.NETFramework中的名称取值范围sbyte有符号8位整数System.SByte-1281

40、27byte无符号8位整数System.Byte0255short有符号16位整数System.Int16-3276832767ushort无符号16位整数System.UInt160!65535int有符号32位整数System.Int32-21474836482147483647uint无符号32位整数System.UInt3204294967295long有符号64位整数System.Int64-92233720368547758089223372036854775807ulong无符号64位整数System.UInt64018446744073709551615char无符号16位整数

41、System.Char065535,16位的Unicode字符。C#从入门到实践从入门到实践3.2.3 3.2.3 浮点型浮点型C#语言包括两种浮点型:语言包括两种浮点型:float和和double。float类型表示类型表示32位的单精度浮点数,它的取值范围为位的单精度浮点数,它的取值范围为1.5e-45。double类型表示类型表示64位的双精度浮点数,它的取值范围为位的双精度浮点数,它的取值范围为5.0e-324。浮点数包括以下。浮点数包括以下3种特殊的值。种特殊的值。正零和负零正零和负零正无穷大和负无穷大正无穷大和负无穷大非数字非数字Not-a-Number值值C#从入门到实践从入门到

42、实践3.2.4 decimal3.2.4 decimal类型类型decimal类型表示类型表示128位的数值,取值范围为位的数值,取值范围为1.0e-28,特,特别适用于财务计算和货币计算。和别适用于财务计算和货币计算。和float类型一样,在书类型一样,在书写写decimal类型的值时,需要在数值后添加后缀类型的值时,需要在数值后添加后缀m,否那,否那么编译出错。么编译出错。与浮点型相比,与浮点型相比,decimal类型具有较高的精度,但取值范围类型具有较高的精度,但取值范围较小。因此,从浮点型到较小。因此,从浮点型到decimal类型的转换可能会产生类型的转换可能会产生溢出异常,而从溢出异

43、常,而从decimal类型到浮点型的转换那么可能导类型到浮点型的转换那么可能导致精度损失。正是由于这些原因,所以,在浮点型和致精度损失。正是由于这些原因,所以,在浮点型和decimal类型之间不存在隐式转换。如果要转换浮点型到类型之间不存在隐式转换。如果要转换浮点型到decimal类型,那么必须使用强制转换方法。类型,那么必须使用强制转换方法。C#从入门到实践从入门到实践3.2.5 bool3.2.5 bool类型类型bool类型表示布尔逻辑量。它只包含两个值:类型表示布尔逻辑量。它只包含两个值:true和和false,而且这两个值意义恰好相反。而且这两个值意义恰好相反。C#从入门到实践从入门

44、到实践3.2.6 3.2.6 枚举类型枚举类型枚举枚举enum类型也是一种值类型,它具有命名常量的独类型也是一种值类型,它具有命名常量的独特的类型。每个枚举类型都有一个根底类型,该根底类特的类型。每个枚举类型都有一个根底类型,该根底类型必须为型必须为byte、sbyte、short、ushort、int、uint、long或或ulong。其中,默认的根底类型为。其中,默认的根底类型为int。枚举类型一般包含一个或多个枚举值,每一个枚举值之间枚举类型一般包含一个或多个枚举值,每一个枚举值之间用逗号用逗号,分隔。枚举值又称为枚举数,它的默认根分隔。枚举值又称为枚举数,它的默认根底类型为底类型为in

45、t。默认情况下,第一个枚举数的值为。默认情况下,第一个枚举数的值为0,后,后面的每一个枚举数的值依次增面的每一个枚举数的值依次增1。C#从入门到实践从入门到实践3.2.7 3.2.7 结构类型结构类型结构类型也是一种值类型,它可以声明常量、字段、方法、结构类型也是一种值类型,它可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态构造函数属性、索引器、运算符、实例构造函数、静态构造函数和嵌套类型。有关结构类型的知识点将在第和嵌套类型。有关结构类型的知识点将在第9章中进行章中进行详细介绍。详细介绍。C#从入门到实践从入门到实践3.2.8 3.2.8 实例一:把整数转换为二进制数实例一

46、:把整数转换为二进制数【实例【实例3-1】实现把整数转换为二进制数的功能。该功能由】实现把整数转换为二进制数的功能。该功能由ConvertIntToBinary(int n)静态函数实现,静态函数实现,n参数表示被参数表示被转换的整数,该函数返回二进制数的字符串形式。转换的整数,该函数返回二进制数的字符串形式。C#从入门到实践从入门到实践3.2.9 3.2.9 实例二:把二进制数转换为整数实例二:把二进制数转换为整数【实例【实例3-2】实现把二进制数转换为整数的功能。该功能由】实现把二进制数转换为整数的功能。该功能由ConvertBinaryToInt(string binary)静态函数实现

47、,静态函数实现,binary参数表示被转换的二进制数的字符串形式,该函参数表示被转换的二进制数的字符串形式,该函数返回一个整数。数返回一个整数。C#从入门到实践从入门到实践3.3 3.3 引用类型引用类型引用类型主要包括引用类型主要包括6种类型:种类型:object类型、类型、string类型、类类类型、类类型、数组类型、接口类型和委托类型。引用类型变量的型、数组类型、接口类型和委托类型。引用类型变量的值是对该类型的某个实例的一个引用。其中,类型的实值是对该类型的某个实例的一个引用。其中,类型的实例被称为对象。在引用类型中,存在一个很特殊的值:例被称为对象。在引用类型中,存在一个很特殊的值:n

48、ull。null能够兼容所有的引用类型,表示能够兼容所有的引用类型,表示“每一被引用每一被引用的实例。本节将详细介绍引用类型的知识点。的实例。本节将详细介绍引用类型的知识点。C#从入门到实践从入门到实践3.3.1 3.3.1 对象类型对象类型对象对象object类型是类型是C#类型系统中所有其他类型的最终类型系统中所有其他类型的最终基类。基类。C#中的每种类型都是直接或间接从中的每种类型都是直接或间接从object类类型类类型派生的。因此,派生的。因此,C#中的任何类型都可以转换为中的任何类型都可以转换为object类类型。型。C#从入门到实践从入门到实践3.3.2 3.3.2 字符串类型字符

49、串类型字符串字符串string类型是直接从类型是直接从object继承而来的类类型,继承而来的类类型,它对应着它对应着.NET Framework中的类型。中的类型。C#从入门到实践从入门到实践3.3.3 3.3.3 类类型类类型类类class类型是类型是C#中最常用的类型。它是一个数据结构,中最常用的类型。它是一个数据结构,能够定义数据成员、函数成员和嵌套类型等内容。其中,能够定义数据成员、函数成员和嵌套类型等内容。其中,数据成员包括常量和字段,函数成员包括方法、属性、数据成员包括常量和字段,函数成员包括方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静事件、索引器、运算符、实例构

50、造函数、析构函数和静态构造函数。态构造函数。特别地,类类型还支持一种被称为特别地,类类型还支持一种被称为“继承的机制。继承继承的机制。继承是指派生类可用来扩展和专门化基类的一种机制。有关是指派生类可用来扩展和专门化基类的一种机制。有关类类型的知识点将在第类类型的知识点将在第8章中进行详细介绍。章中进行详细介绍。C#从入门到实践从入门到实践3.3.4 3.3.4 数组类型数组类型数组数组Array是一种数据结构,它可以将多个类型相同的是一种数据结构,它可以将多个类型相同的元素组合为一个整体,从而通过数组统一访问或操作这元素组合为一个整体,从而通过数组统一访问或操作这些元素。数字可以通过计算索引来

51、访问数组中的每一个些元素。数字可以通过计算索引来访问数组中的每一个元素。每一个元素的类型称为数字的元素类型。元素。每一个元素的类型称为数字的元素类型。C#从入门到实践从入门到实践3.3.5 3.3.5 接口类型接口类型接口接口interface类型和类类型非常相似。它也是一个数类型和类类型非常相似。它也是一个数据结构,能够声明数据成员和函数成员。其中,数据成据结构,能够声明数据成员和函数成员。其中,数据成员主要包括属性,函数成员包括方法和事件。员主要包括属性,函数成员包括方法和事件。C#从入门到实践从入门到实践3.3.6 3.3.6 委托类型委托类型委托委托delegate也是一种数据结构,它

52、能够引用一个或多也是一种数据结构,它能够引用一个或多个方法。特别地,对于实例方法,它还能够引用这些方个方法。特别地,对于实例方法,它还能够引用这些方法所对应的对象实例。读者如果熟悉法所对应的对象实例。读者如果熟悉C+中的函数指针,中的函数指针,那么就不难理解委托这一概念了。那么就不难理解委托这一概念了。委托类型类似于委托类型类似于C+中的函数指针,但是它是类型平安的。中的函数指针,但是它是类型平安的。委托类型能够将方法作为参数进行传递,并且还可以定委托类型能够将方法作为参数进行传递,并且还可以定义回调方法。义回调方法。C#从入门到实践从入门到实践3.4 3.4 装箱和拆箱装箱和拆箱引用类型总是

53、分配在托管堆上,而值类型总是分配在堆栈引用类型总是分配在托管堆上,而值类型总是分配在堆栈上。有时,程序需要获取指向值类型的引用。此时,需上。有时,程序需要获取指向值类型的引用。此时,需要将值类型转换为引用类型,这一操作被称为装箱。反要将值类型转换为引用类型,这一操作被称为装箱。反之,把引用类型转换为值类型称为拆箱。之,把引用类型转换为值类型称为拆箱。装箱和拆箱是装箱和拆箱是C#的类型系统中两个很重要的概念,它在值的类型系统中两个很重要的概念,它在值类型和引用类型之间的架起了一座桥梁。通过装箱和拆类型和引用类型之间的架起了一座桥梁。通过装箱和拆箱操作,可以将任何值类型的变量的值转换为引用类型箱操

54、作,可以将任何值类型的变量的值转换为引用类型的变量的值。反之,也可以进行转换。特别地,有了装的变量的值。反之,也可以进行转换。特别地,有了装箱和拆箱操作,就可以将箱和拆箱操作,就可以将C#类型系统中的任何类型的值类型系统中的任何类型的值最终都可以按对象来处理。最终都可以按对象来处理。C#从入门到实践从入门到实践3.4.1 3.4.1 装箱装箱装箱是指将值类型隐式转换为引用类型。对于值类型而言,装箱是指将值类型隐式转换为引用类型。对于值类型而言,装箱的具体操作为:首先分配一个对象实例,然后将值装箱的具体操作为:首先分配一个对象实例,然后将值类型的值复制到该实例中。装箱前后不是同一个实例。类型的值

55、复制到该实例中。装箱前后不是同一个实例。对于引用类型而言,装箱前后都共享同一个实例。对于引用类型而言,装箱前后都共享同一个实例。C#从入门到实践从入门到实践3.4.2 3.4.2 拆箱拆箱拆箱是指将引用类型隐式转换为值类型。拆箱的具体操作拆箱是指将引用类型隐式转换为值类型。拆箱的具体操作包括以下包括以下2个步骤。个步骤。1检查该对象实例是否为给定值类型的一个装了箱的值。检查该对象实例是否为给定值类型的一个装了箱的值。2将值从实例中复制出来。将值从实例中复制出来。C#从入门到实践从入门到实践3.5 3.5 小结小结本章主要介绍了本章主要介绍了C#语言的类型系统的根底知识,如值类型、语言的类型系统

56、的根底知识,如值类型、引用类型、类型转换、装箱、拆箱等。其中,读者要着引用类型、类型转换、装箱、拆箱等。其中,读者要着重掌握值类型和引用类型,为后续编写重掌握值类型和引用类型,为后续编写C#程序代码奠定程序代码奠定根底。下一章将要介绍根底。下一章将要介绍C#语言中的变量。语言中的变量。C#从入门到实践从入门到实践3.6 3.6 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_03的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。

57、2创立一个整型变量创立一个整型变量vint和一个字符串变量和一个字符串变量vstring,将,将vint变量转换为字符串,将变量转换为字符串,将vstring变量转换为一个整数。变量转换为一个整数。C#从入门到实践从入门到实践第第4 4章章 变量变量变量是变量是C#语言中最为根本的概念之一,它表示存储位置。语言中最为根本的概念之一,它表示存储位置。每一个变量的值由其类型确定。本章将讲解每一个变量的值由其类型确定。本章将讲解C#语言中各语言中各种变量,主要介绍以下知识点。种变量,主要介绍以下知识点。变量概述;变量概述;变量分类;变量分类;变量赋值;变量赋值;使用值参数传递数据;使用值参数传递数据

58、;使用使用ref参数传递数据;参数传递数据;使用使用out参数传递数据;参数传递数据;变量转换。变量转换。C#从入门到实践从入门到实践4.1 4.1 变量概述变量概述在在C#语言中,变量表示存储位置。每一个变量都具有一个语言中,变量表示存储位置。每一个变量都具有一个类型,该类型确定变量存储的内容。对于两个变量而言,类型,该类型确定变量存储的内容。对于两个变量而言,如果它们的值相同,但是类型不同,那么该变量存储的如果它们的值相同,但是类型不同,那么该变量存储的值是不相同的。值是不相同的。声明一个变量之后,该变量可能具有初始值,也可能不具声明一个变量之后,该变量可能具有初始值,也可能不具有初始值。

59、如果变量具有初始值,那么称之为初始已赋有初始值。如果变量具有初始值,那么称之为初始已赋值值initially assigned。如果变量不具有初始值,那么。如果变量不具有初始值,那么称之为初始未赋值称之为初始未赋值initially unassigned。如果是第一次明确指定变量的值,那么称之为变量的初始如果是第一次明确指定变量的值,那么称之为变量的初始化。如果是初始未赋值变量,必须经过初始化之后,才化。如果是初始未赋值变量,必须经过初始化之后,才能够被使用。能够被使用。C#从入门到实践从入门到实践4.2 4.2 变量分类变量分类C#语言定义了语言定义了7种不同类别的变量:静态变量、实例变量、

60、种不同类别的变量:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。数组元素、值参数、引用参数、输出参数和局部变量。本小节将详细介绍这本小节将详细介绍这7种类别的变量。种类别的变量。C#从入门到实践从入门到实践4.2.1 4.2.1 静态变量静态变量静态变量静态变量static variable是指使用是指使用static修饰符声明的变修饰符声明的变量。静态变量总是在包含了它的那个类型的静态构造函量。静态变量总是在包含了它的那个类型的静态构造函数第数第8章执行之前就存在了,在关联的应用程序域章执行之前就存在了,在关联的应用程序域终止时终止。终止时终止。C#从入门到实践从入门到

61、实践4.2.2 4.2.2 实例变量实例变量实例变量实例变量instance variable和静态变量相对应。实例变和静态变量相对应。实例变量是指未使用量是指未使用static修饰符声明的变量。实例变量包括两修饰符声明的变量。实例变量包括两种类型的变量:类的实例变量和结构的实例变量。种类型的变量:类的实例变量和结构的实例变量。1类的实例变量类的实例变量2结构的实例变量结构的实例变量C#从入门到实践从入门到实践4.2.3 4.2.3 局部变量局部变量顾名思义,局部变量顾名思义,局部变量local variable是在应用程序的某是在应用程序的某一段时间内存在。局部变量可以声明在块一段时间内存在

62、。局部变量可以声明在块block、for语句、语句、switch语句和语句和using语句中,即局部变量是通过语句中,即局部变量是通过“local-variable-declaration来声明的。来声明的。C#从入门到实践从入门到实践4.2.4 4.2.4 值参数值参数对于一个函数成员而言,它都存在一个参数列表紧跟在对于一个函数成员而言,它都存在一个参数列表紧跟在函数成员名称之后的小括弧中。当然,该参数列表可函数成员名称之后的小括弧中。当然,该参数列表可以是空,也可以包含一个或多个参数,多个参数之间使以是空,也可以包含一个或多个参数,多个参数之间使用逗号用逗号,分隔。分隔。在声明参数时,可以

63、不使用修饰符,也可以使用在声明参数时,可以不使用修饰符,也可以使用ref或或out修修饰符。值参数饰符。值参数value parameter是指未使用是指未使用ref或或out修饰符声明的参数。修饰符声明的参数。C#从入门到实践从入门到实践4.2.5 ref4.2.5 ref参数参数引用参数引用参数reference parameter是值使用是值使用ref修饰符声明修饰符声明的参数。引用参数和值参数最大的一个区别在于:在函的参数。引用参数和值参数最大的一个区别在于:在函数成员中,函数成员为值参数分配了一个新的存储位置,数成员中,函数成员为值参数分配了一个新的存储位置,而引用参数仍然使用其根底

64、变量的存储位置。即引用参而引用参数仍然使用其根底变量的存储位置。即引用参数和其根底变量操作了同一个变量,而值参数和其根底数和其根底变量操作了同一个变量,而值参数和其根底变量是操作了两个不同变量,而且不互相影响。变量是操作了两个不同变量,而且不互相影响。C#从入门到实践从入门到实践4.2.6 out4.2.6 out参数参数输出参数输出参数output parameter是值使用是值使用out修饰符声明的修饰符声明的参数。输出参数和值参数最大的一个区别在于:在函数参数。输出参数和值参数最大的一个区别在于:在函数成员中,函数成员为值参数分配了一个新的存储位置;成员中,函数成员为值参数分配了一个新的

65、存储位置;输出参数不创立新的存储位置,而是使用根底变量的存输出参数不创立新的存储位置,而是使用根底变量的存储位置。因此,输出参数的值总是与根底变量相同。储位置。因此,输出参数的值总是与根底变量相同。简而言之,根底变量实际上是分配了一个存储位置,在调简而言之,根底变量实际上是分配了一个存储位置,在调用包含用包含out参数的函数成员时,该函数成员将在这一个存参数的函数成员时,该函数成员将在这一个存储位置存储新的值,并修改根底变量的值。储位置存储新的值,并修改根底变量的值。C#从入门到实践从入门到实践4.2.7 4.2.7 数组元素数组元素数组元素是指作为函数成员参数的数组第数组元素是指作为函数成员

66、参数的数组第8章的元素,章的元素,它总是在创立数组实例时开始存在,在没有对该数组实它总是在创立数组实例时开始存在,在没有对该数组实例的引用时停止存在。每个数组元素的初始值都是其数例的引用时停止存在。每个数组元素的初始值都是其数组元素类型的默认值。组元素类型的默认值。C#从入门到实践从入门到实践4.3 4.3 变量赋值变量赋值变量赋值是指给变量指定某一个明确的值,如变量赋值是指给变量指定某一个明确的值,如“int i = 2021;语句在声明语句在声明i变量的同时给该变量赋值为变量的同时给该变量赋值为2021。在函数成员可执行代码中的给定位置,如果编译器可确在函数成员可执行代码中的给定位置,如果

67、编译器可确定变量已自动初始化或已成为至少一个赋值的目标,那定变量已自动初始化或已成为至少一个赋值的目标,那么称该变量已明确赋值么称该变量已明确赋值definitely assigned。C#从入门到实践从入门到实践4.4 4.4 实例一:使用值参数传递数据实例一:使用值参数传递数据【实例【实例4-1】演示了使用值参数传递数据的方法。该功能由】演示了使用值参数传递数据的方法。该功能由static int CountSum(int i,int j)静态函数实现,静态函数实现,i和和j参数参数均为值参数。均为值参数。CountSum(int i,int j)函数返回函数返回i和和j参数的参数的值增值

68、增1之后的和。之后的和。C#从入门到实践从入门到实践4.5 4.5 实例二:使用实例二:使用refref参数传递数据参数传递数据【实例【实例4-2】演示了使用】演示了使用ref参数传递数据的方法。该功能由参数传递数据的方法。该功能由static int RefCountSum(ref int i,ref int j)静态函数实现,静态函数实现,i和和j参数均为参数均为ref参数。参数。RefCountSum(ref int i,ref int j)函函数返回数返回i和和j参数的值增参数的值增1之后的和。之后的和。C#从入门到实践从入门到实践4.6 4.6 实例三:使用实例三:使用outout参

69、数返回数据参数返回数据【实例【实例4-3】演示了使用】演示了使用out参数传递数据的方法。该功能参数传递数据的方法。该功能由由static void OutCountSum(int i,int j,out int sum)静态函静态函数实现,数实现,i和和j参数均为的值参数,参数均为的值参数,sum参数为参数为out参数。参数。OutCountSum(int i,int j,out int sum)函数本身不返回值,函数本身不返回值,但是用但是用sum参数保存参数保存i和和j参数的值增参数的值增1之后的和。之后的和。C#从入门到实践从入门到实践4.7 4.7 变量转换变量转换转换转换conve

70、rsion使一种类型的表达式可以被视为另一种使一种类型的表达式可以被视为另一种类型。变量转换类型。变量转换variable conversion使一种类型的变使一种类型的变量可以被视为另一种类型。转换可以分为隐式转换量可以被视为另一种类型。转换可以分为隐式转换implicit conversion和显式转换和显式转换explicit conversion。如果在转换时,需要添加强制转换的类型,那么该转换如果在转换时,需要添加强制转换的类型,那么该转换为显式转换。本小节将介绍变量转换的知识点。为显式转换。本小节将介绍变量转换的知识点。C#从入门到实践从入门到实践4.7.1 4.7.1 隐式转换隐

71、式转换隐式转换是指不需要添加强制转换的类型的转换。常用的隐式转换是指不需要添加强制转换的类型的转换。常用的隐式转换包括以下几种。隐式转换包括以下几种。l标识转换,在同一类型内进行转换,它能够使已具有所标识转换,在同一类型内进行转换,它能够使已具有所需类型的实体可被认为是可转换的。需类型的实体可被认为是可转换的。l隐式数值转换,如从隐式数值转换,如从int类型转换为类型转换为long类型等。类型等。l隐式枚举转换,将数值转换为枚举类型。隐式枚举转换,将数值转换为枚举类型。l隐式引用转换,如引用类型转换为隐式引用转换,如引用类型转换为object类型等。类型等。l装箱转换,如值类型转换为装箱转换,

72、如值类型转换为object类型等。类型等。l隐式常量表达式转换,如将隐式常量表达式转换,如将int类型转换为类型转换为uint类型等。类型等。l用户定义的隐式转换,包括以下用户定义的隐式转换,包括以下3个步骤:一个标准的隐个步骤:一个标准的隐式转换;执行用户定义的隐式转换运算符;另一个标准式转换;执行用户定义的隐式转换运算符;另一个标准的隐式转换。的隐式转换。C#从入门到实践从入门到实践4.7.2 4.7.2 显示转换显示转换显式转换是指需要添加强制转换的类型的转换。常用的显显式转换是指需要添加强制转换的类型的转换。常用的显式转换包括以下几种。式转换包括以下几种。l显式数值转换,如显式数值转换

73、,如long类型转换为类型转换为int类型等。类型等。l显式枚举转换,如显式枚举转换,如int类型转换为枚举类型等。类型转换为枚举类型等。l显式引用转换,如显式引用转换,如object类型转换为引用类型等。类型转换为引用类型等。l显式接口转换,如显式接口转换,如object类型转换为接口类型等。类型转换为接口类型等。l拆箱转换,如拆箱转换,如object类型转换为值类型等。类型转换为值类型等。l用户定义的显式转换用户定义的显式转换, 包括以下包括以下3个步骤:一个标准的隐个步骤:一个标准的隐式转换;执行用户定义的显式转换运算符;另一个标准式转换;执行用户定义的显式转换运算符;另一个标准的隐式转

74、换。的隐式转换。C#从入门到实践从入门到实践4.8 4.8 小结小结本章主要介绍了本章主要介绍了C#语言中的变量的根底知识,如变量概述、语言中的变量的根底知识,如变量概述、变量分类、变量赋值、值参数、变量分类、变量赋值、值参数、ref参数、参数、out参数、变参数、变量转换等。其中,读者要着重掌握变量赋值、值参数、量转换等。其中,读者要着重掌握变量赋值、值参数、ref参数、参数、out参数和变量转换,为后续编写参数和变量转换,为后续编写C#程序代码程序代码奠定根底。下一章将要介绍奠定根底。下一章将要介绍C#语言中的表达式和运算符。语言中的表达式和运算符。C#从入门到实践从入门到实践4.9 习题

75、习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_04的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“ValueF的方法,且该方法使用值的方法,且该方法使用值参数参数value。3创立一个名称为创立一个名称为“RefF的方法,且该方法使用的方法,且该方法使用ref参参数数value。4创立一个名称为创立一个名称为“OutF的方法,且该方法使用的方法,且该方法使用out参数参数value。C#从入门到实

76、践从入门到实践第第5 5章章 表达式和运算符表达式和运算符表达式是表达式是C#语言组成的重要元素之一,它是可以计算且结语言组成的重要元素之一,它是可以计算且结果为单个值、对象、方法或命名空间的代码片段。表达果为单个值、对象、方法或命名空间的代码片段。表达式也可以包含文本值、方法调用、运算符及其操作数,式也可以包含文本值、方法调用、运算符及其操作数,或简单名称。简单的说,表达式是一个由操作数和运算或简单名称。简单的说,表达式是一个由操作数和运算符组成的序列。本章将讲解符组成的序列。本章将讲解C#语言中的表达式和运算符,语言中的表达式和运算符,主要介绍以下知识点。主要介绍以下知识点。l表达式分类;

77、表达式分类;lthis、base和和new关键字;关键字;l运算符;运算符;l运算检查;运算检查;l运算符重载。运算符重载。C#从入门到实践从入门到实践5.1 5.1 表达式表达式表达式是一个由操作数表达式是一个由操作数operand和运算符和运算符operator构成的序列。运算符指定操作数的运算规那么,即指示构成的序列。运算符指定操作数的运算规那么,即指示对表达式中的操作数进行什么样的运算。本节将介绍表对表达式中的操作数进行什么样的运算。本节将介绍表达式的知识点。达式的知识点。C#从入门到实践从入门到实践5.1.1 5.1.1 表达式分类表达式分类在在C#语言中,可以把表达式分为以下语言中

78、,可以把表达式分为以下9种类别,如表所示。种类别,如表所示。表达式类型说明值每一个值都有关联的类型。变量每一个变量都有关联的类型。如果该变量存在了相关的类型,则称该变量为已声明类型的变量。命名空间C#程序是利用命名空间组织起来的。类型指定变量数据的存储方式和操作方法。方法组表示一组方法,并可以通过实例调用方法组中的方法。属性访问每个属性访问都有关联的类型,即该属性的类型。事件访问每个事件访问都有关联的类型,即该事件的类型。索引器访问每个索引器访问都有关联的类型,即该索引器的元素类型。Nothing出现在调用一个具有void返回类型的方法时。C#从入门到实践从入门到实践5.1.2 this5.1

79、.2 this关键字关键字this关键字可以用来引用类的当前实例,还可以用作扩展方关键字可以用来引用类的当前实例,还可以用作扩展方法的第一个参数的修饰符。法的第一个参数的修饰符。this关键字存在以下关键字存在以下3种常用种常用用法。用法。1限定名称相同的成员限定名称相同的成员2将对象本身作为参数将对象本身作为参数3声明索引器声明索引器C#从入门到实践从入门到实践5.1.3 base5.1.3 base关键字关键字base关键字用于从派生类中访问基类的成员,主要存在以关键字用于从派生类中访问基类的成员,主要存在以下下2种用法。种用法。调用基类上已被其他方法重写的方法。调用基类上已被其他方法重写

80、的方法。指定创立派生类实例时应调用的基类构造函数。指定创立派生类实例时应调用的基类构造函数。base关键字之后一般跟着关键字之后一般跟着“.标记和一个标识符或一个用标记和一个标识符或一个用方括号括起来的表达式列表。方括号括起来的表达式列表。C#从入门到实践从入门到实践5.1.4 new5.1.4 new关键字关键字new关键字可以作为关键字可以作为new运算符、运算符、new修饰符或修饰符或new约束。约束。1new运算符运算符2new修饰符修饰符3new约束约束C#从入门到实践从入门到实践5.2 5.2 运算符运算符运算符是表达式很重要的一局部,它指示对表达式中的操运算符是表达式很重要的一局

81、部,它指示对表达式中的操作数进行什么样的运算,如作数进行什么样的运算,如+、-、*、/、%等。根据运等。根据运算符所需操作数的个数,可以把运算符分为以下算符所需操作数的个数,可以把运算符分为以下3类。类。本节介绍运算符的知识点。本节介绍运算符的知识点。一元运算符,只带有一个操作数并使用前缀表示法如一元运算符,只带有一个操作数并使用前缀表示法如-x或后缀表示法如或后缀表示法如x+,如,如+、-等运算符。等运算符。二元运算符,带有两个操作数并且全都使用中缀表示法二元运算符,带有两个操作数并且全都使用中缀表示法如如x+y,如,如+、-、*、/等运算符。等运算符。三元运算符,带有三元运算符,带有3个操

82、作数并使用中缀表示法,如个操作数并使用中缀表示法,如?: 运运算符。算符。C#从入门到实践从入门到实践5.2.1 5.2.1 运算符优先级运算符优先级算术表达式是最为常见的一种表达式。它由操作数和运算算术表达式是最为常见的一种表达式。它由操作数和运算符组成,而且这些运算符之间是存在一定优先级的,如符组成,而且这些运算符之间是存在一定优先级的,如*运算符的优先级就大于运算符的优先级就大于+运算符的优先级。运算符的优先级。C#语言中的语言中的运算符一样,也存在优先级。在计算表达式的值时,也运算符一样,也存在优先级。在计算表达式的值时,也必须遵循运算符的优先级的规那么。必须遵循运算符的优先级的规那么

83、。C#从入门到实践从入门到实践5.2.2 5.2.2 一元运算符一元运算符+、-、!、+x、-x和和(T)x被称为一元运算符。其中,被称为一元运算符。其中,(T)x运算符为强制转换运算符,它可以将一种类型转换运算符为强制转换运算符,它可以将一种类型转换为另外一种类型。为另外一种类型。+、-和和运算符分别表示一元加运算、运算符分别表示一元加运算、一元减运算和按位求补运算。下面详细介绍一元减运算和按位求补运算。下面详细介绍!、+x、-x和和(T)x运算符的使用方法。运算符的使用方法。1+运算符运算符2-运算符运算符3!运算符运算符4(T)x运算符运算符C#从入门到实践从入门到实践5.2.3 5.2

84、.3 算术运算符算术运算符*、/、%、+和和运算符称为算术运算符,它们分别表示乘运算符称为算术运算符,它们分别表示乘法、除法、余数、加法和减法运算。语法如下。法、除法、余数、加法和减法运算。语法如下。left expression operator right expressionleft expression和和right expression分别表示左操作数和右操分别表示左操作数和右操作数,作数,operator表示运算符,可以为表示运算符,可以为*、/、%、+和和。C#从入门到实践从入门到实践5.2.4 5.2.4 逻辑运算符逻辑运算符&、和和|运算符称为逻辑运算符。运算符称为逻辑运算符

85、。&运算符计算两个操作数运算符计算两个操作数的按位逻辑的按位逻辑AND,|运算符计算两个操作数的按位逻辑运算符计算两个操作数的按位逻辑OR,运算符计算两个操作数的按位逻辑运算符计算两个操作数的按位逻辑XOR。语法如。语法如下。下。left expression operator right expressionleft expression和和right expression分别表示左操作数和右操分别表示左操作数和右操作数,作数,operator表示运算符,可以为表示运算符,可以为&、和和|。C#从入门到实践从入门到实践5.2.5 5.2.5 条件运算符条件运算符?:运算符称为条件运算符,它是

86、运算符称为条件运算符,它是C#语言中唯一的一个三元语言中唯一的一个三元运算符,语法如下。运算符,语法如下。条件表达式条件表达式 ? resulta : resultb;该表达式首先计算条件表达式的值。如果条件表达式的值该表达式首先计算条件表达式的值。如果条件表达式的值为真,那么为真,那么resulta的值,并成为运算结果。否那么计算的值,并成为运算结果。否那么计算resultb,并成为运算结果。,并成为运算结果。C#从入门到实践从入门到实践5.2.6 5.2.6 条件逻辑运算符条件逻辑运算符&和和|运算符称为条件逻辑运算符。运算符称为条件逻辑运算符。&运算符为逻辑与运算运算符为逻辑与运算符,它

87、计算左右操作数的逻辑与。符,它计算左右操作数的逻辑与。|运算符为逻辑或运算运算符为逻辑或运算符,它计算左右操作数的逻辑或。语法如下。符,它计算左右操作数的逻辑或。语法如下。left expression operator right expressionleft expression和和right expression分别表示左操作数和右操分别表示左操作数和右操作数,作数,operator表示运算符,可以为表示运算符,可以为&和和|。C#从入门到实践从入门到实践5.2.7 5.2.7 移位运算符移位运算符运算符被称为移位运算符。运算符被称为移位运算符。运算符表示右移位。语法如下:运算符表示右移

88、位。语法如下:erpression operator count;expression表示被移位的表达式,表示被移位的表达式,count表示移动的位数,表示移动的位数,operator表示运算符,可以为表示运算符,可以为。C#从入门到实践从入门到实践5.2.8 5.2.8 关系和类型测试运算符关系和类型测试运算符=、!=、=、is和和as运算符称为关系和类型测试运算运算符称为关系和类型测试运算符。语法如下:符。语法如下:left expression operator right expressionleft expression和和right expression分别表示左操作数和右操作数,

89、分别表示左操作数和右操作数,operator表示运算符,可以为表示运算符,可以为=、!=、=、is和和as。其中,。其中,=、!=、=运算符为比较运算符,它们运算符为比较运算符,它们的具体计算方法如下:的具体计算方法如下:x = y,如果,如果x等于等于y,那么为,那么为true,否那么为,否那么为false。x != y,如果,如果x不等于不等于y,那么为,那么为true,否那么为,否那么为false。x y,如果,如果x大于大于y,那么为,那么为true,否那么为,否那么为false。x = y,如果,如果x大于等于大于等于y,那么为,那么为true,否那么为,否那么为false。C#从入

90、门到实践从入门到实践5.2.9 5.2.9 赋值运算符赋值运算符=、*=、/=、%=、+=、-=、=、&=、=和和|=运算符运算符被称为赋值运算符,它们能够为变量、属性、事件或索被称为赋值运算符,它们能够为变量、属性、事件或索引器元素赋新值。语法如下:引器元素赋新值。语法如下:left expression operator right expressionleft expression和和right expression分别表示左操作数和右操分别表示左操作数和右操作数,作数,operator表示运算符,如表示运算符,如=、*=、/=等。等。C#从入门到实践从入门到实践5.3 5.3 实例一:

91、使用实例一:使用checkedchecked和和uncheckedunchecked运算运算符检查运算符检查运算【实例【实例5-1】演示了使用】演示了使用checked和和unchecked运算符检查运运算符检查运算的方法。该功能由算的方法。该功能由static void CheckCompute()静态函静态函数实现。数实现。C#从入门到实践从入门到实践5.4 5.4 实例二:复数运算符重载实例二:复数运算符重载在在C#语言中,所有一元和二元运算符都具有可自动用于任何表达语言中,所有一元和二元运算符都具有可自动用于任何表达式的预定义实现。除了预定义运算操作之外,还可通过在类或结式的预定义实现

92、。除了预定义运算操作之外,还可通过在类或结构中设置构中设置operator声明来引入用户定义的运算操作。这一技术被声明来引入用户定义的运算操作。这一技术被称为运算符重载。称为运算符重载。注意:用户定义的运算符操作的优先级总是高于预定义运算符操注意:用户定义的运算符操作的优先级总是高于预定义运算符操作的优先级。作的优先级。运算符重载可以分为一元运算符重载和二元运算符重载,重载方运算符重载可以分为一元运算符重载和二元运算符重载,重载方法如表所示。法如表所示。运算符表示法重载函数表示法说明opxoperatorop(x)op为运算符xopoperatorop(x)xopyoperatorop(x,y

93、)C#从入门到实践从入门到实践5.5 5.5 小结小结本章主要介绍了本章主要介绍了C#语言中的表达式和运算符,如表达式分语言中的表达式和运算符,如表达式分类、类、this关键字、关键字、base关键字、关键字、new关键字、运算符、运关键字、运算符、运算符重载等。其中,读者要着重掌握表达式、运算符和算符重载等。其中,读者要着重掌握表达式、运算符和运算符重载,为后续编写运算符重载,为后续编写C#程序代码奠定根底。下一章程序代码奠定根底。下一章将要介绍将要介绍C#语言中的语句。语言中的语句。C#从入门到实践从入门到实践5.6 5.6 习题习题在在Visual Studio 2021集成开发环境中创

94、立名称为集成开发环境中创立名称为“Test_05的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“Sum的方法,且在该方法中使用的方法,且在该方法中使用checked和和unchecked运算符检查计算两个数的和的运算运算符检查计算两个数的和的运算操作。操作。C#从入门到实践从入门到实践第第6 6章章 语句语句和其他编程开发语言如和其他编程开发语言如C、C+等一样,等一样,C#语言也是语言也是由各种各样的语句有序构建而成的。语句可以声明局部由各种各样的语句

95、有序构建而成的。语句可以声明局部变量或常量,调用方法,创立对象,将值赋予变量、属变量或常量,调用方法,创立对象,将值赋予变量、属性或字段等。一般地,语句以性或字段等。一般地,语句以;分号终止。本章将分号终止。本章将讲解讲解C#语言中的各种语句,主要介绍以下知识点。语言中的各种语句,主要介绍以下知识点。根本语句;根本语句;跳转语句;跳转语句;选择语句;选择语句;迭代语句;迭代语句;其他语句。其他语句。C#从入门到实践从入门到实践6.1 6.1 语句概述语句概述和其他程序开发语言一样,和其他程序开发语言一样,C#语言也提供了多种语句。语言也提供了多种语句。C#语言的语句可以分为以下语言的语句可以分

96、为以下3个大类:个大类:l标记语句,给语句加上一个标签作为前缀。标记语句,给语句加上一个标签作为前缀。l声明语句,用来声明局部变量或常量声明语句,用来声明局部变量或常量l嵌入语句,能够嵌入到本身语句或其他语句中执行的语嵌入语句,能够嵌入到本身语句或其他语句中执行的语句。句。C#从入门到实践从入门到实践6.2 6.2 根本语句根本语句C#语言包含多种常用的根本语句,如空语句、标记语句、语言包含多种常用的根本语句,如空语句、标记语句、表达式语句、声明语句、块等。本节将详细介绍创立这表达式语句、声明语句、块等。本节将详细介绍创立这些语句的方法。些语句的方法。C#从入门到实践从入门到实践6.2.1 6

97、.2.1 空语句空语句顾名思义,空语句顾名思义,空语句empty statement不包括任何实际性不包括任何实际性语句,它什么都不做。空语句的语法形式如下:语句,它什么都不做。空语句的语法形式如下:;当在要求有语句的上下文中不执行任何操作时,使用空语当在要求有语句的上下文中不执行任何操作时,使用空语句句C#从入门到实践从入门到实践6.2.2 6.2.2 标记语句标记语句标记语句标记语句labeled statement可以给语句加上一个标签作可以给语句加上一个标签作为前缀,它可以出现在块第节中,但是不允许它们为前缀,它可以出现在块第节中,但是不允许它们作为嵌入语句。标记语句的语法形式如下:作

98、为嵌入语句。标记语句的语法形式如下:identifier : statement;identifier为标签的名称。在同一个块中,不能存在两个同为标签的名称。在同一个块中,不能存在两个同名的标签,否那么会产生编译错误。名的标签,否那么会产生编译错误。statement表示被标表示被标签标记的语句。签标记的语句。C#从入门到实践从入门到实践6.2.3 6.2.3 表达式语句表达式语句表达式语句是表达式语句是C#语言程序代码中最为常见的一种语句,它语言程序代码中最为常见的一种语句,它用来计算所给定表达式的值,而且由该表达式计算的值用来计算所给定表达式的值,而且由该表达式计算的值将被丢弃。实际上,表

99、达式的值只是一个中间结果。表将被丢弃。实际上,表达式的值只是一个中间结果。表达式语句包括以下达式语句包括以下7类语句:类语句:赋值表达式,如赋值表达式,如“i = 2021;等。等。调用表达式,如调用表达式,如“Count();等。等。创立对象表达式,如创立对象表达式,如“object o = new object();等。等。前缀递减表达式,如前缀递减表达式,如“- i等。等。前缀递增表达式,如前缀递增表达式,如“+ i等。等。后缀递减表达式,如后缀递减表达式,如“i -等。等。后缀递增表达式,如后缀递增表达式,如“i +等。等。C#从入门到实践从入门到实践6.2.4 6.2.4 声明语句声

100、明语句声明语句用来声明局部变量或常量,它可以出现在块第声明语句用来声明局部变量或常量,它可以出现在块第节中,但不允许它们作为嵌入语句使用。声明语句包节中,但不允许它们作为嵌入语句使用。声明语句包括声明局部变量语句和声明局部常量语句。声明局部变括声明局部变量语句和声明局部常量语句。声明局部变量语句用来声明一个局部变量。量语句用来声明一个局部变量。C#从入门到实践从入门到实践6.2.5 6.2.5 块块块块block用于编写多条语句,并且可以将整个块看成一用于编写多条语句,并且可以将整个块看成一个单个语句。块的语法形式如下:个单个语句。块的语法形式如下: statement-list statem

101、ent-list为一个语句列表,它是可选的。如果不存在为一个语句列表,它是可选的。如果不存在statement-list,那么称该块是空的。语句列表是由一个,那么称该块是空的。语句列表是由一个或多个顺序编写的语句组成。或多个顺序编写的语句组成。C#从入门到实践从入门到实践6.3 6.3 跳转语句跳转语句跳转语句跳转语句jump statement用于无条件地转移程序的控制,用于无条件地转移程序的控制,它包括以下它包括以下5种跳转语句:种跳转语句:break语句,用于退出直接封闭它所在的语句,用于退出直接封闭它所在的switch第小节中第小节中介绍、介绍、while第小节中介绍、第小节中介绍、d

102、o第小节中介绍、第小节中介绍、for第小节中介绍或第小节中介绍或foreach语句第小节中介绍。语句第小节中介绍。continue语句,用于开始直接封闭它的语句,用于开始直接封闭它的while、do、for或或foreach语句的一次新循环。语句的一次新循环。return语句,一般用于函数成员的返回操作,即将控制返语句,一般用于函数成员的返回操作,即将控制返回到函数成员的调用方。回到函数成员的调用方。throw语句,用于产生一个异常。语句,用于产生一个异常。goto语句,跳转到指定的标签位置。语句,跳转到指定的标签位置。C#从入门到实践从入门到实践6.3.1 break6.3.1 break语

103、句语句break语句用于退出直接封闭它所在的语句用于退出直接封闭它所在的switch、while、do、for或或foreach语句。它的语法形式如下:语句。它的语法形式如下:break;注意:注意:break语句只能用在语句只能用在switch、while、do、for或或foreach语句中,否那么发生编译时错误。语句中,否那么发生编译时错误。如果如果break语句位于多层嵌套的语句位于多层嵌套的switch、while、do、for或或foreach语句中,语句中,break语句只能应用于最里层的语句。语句只能应用于最里层的语句。C#从入门到实践从入门到实践6.3.2 continue6

104、.3.2 continue语句语句continue语句用于开始直接封闭它的语句用于开始直接封闭它的while、do、for或或foreach语句的一次新迭代。它的语法形式如下:语句的一次新迭代。它的语法形式如下:continue;注意:注意:continue语句只能用在语句只能用在while、do、for或或foreach语句语句中,否那么发生编译时错误。中,否那么发生编译时错误。如果如果continue语句位于多层嵌套的语句位于多层嵌套的while、do、for或或foreach语句中,语句中,continue语句只能应用于最里层的语句。语句只能应用于最里层的语句。C#从入门到实践从入门到实

105、践6.3.3 return6.3.3 return语句语句return语句一般用于函数成员的返回操作,即将控制返回语句一般用于函数成员的返回操作,即将控制返回到函数成员的调用方。它的语法形式如下:到函数成员的调用方。它的语法形式如下:return expressionopt;expressionopt为返回值的表达式,它是一个可选表达式。为返回值的表达式,它是一个可选表达式。return语句存在以下两种形式:语句存在以下两种形式:不带不带expressionopt表达式的表达式的return语句,只能用在返回类型语句,只能用在返回类型为为void的函数成员、属性的的函数成员、属性的set访问器

106、第访问器第8章、事件章、事件的的add和和remove访问器第访问器第8章、实例构造函数第章、实例构造函数第8章、静态构造函数第章、静态构造函数第8章或析构函数第章或析构函数第8章中。章中。带带expressionopt表达式的表达式的return语句,只能用在返回类型不语句,只能用在返回类型不是是void的函数成员、属性的的函数成员、属性的get访问器第访问器第8章。章。expressionopt表达式必须能够隐式转换为其所在函数成表达式必须能够隐式转换为其所在函数成员的返回类型。员的返回类型。C#从入门到实践从入门到实践6.3.4 throw6.3.4 throw语句语句throw语句用来

107、引发一个异常。它的语法形式如下:语句用来引发一个异常。它的语法形式如下:throw expressionopt;expressionopt为返回值的表达式,它是一个可选表达式。为返回值的表达式,它是一个可选表达式。和和return语句一样,语句一样,throw语句也分为以下两种形式:语句也分为以下两种形式:不带表达式的不带表达式的throw语句,只能用在语句,只能用在catch块第节中,块第节中,它将重新引发当前正由该它将重新引发当前正由该catch块处理的那个异常。块处理的那个异常。带表达式的带表达式的throw语句,通过语句,通过expressionopt表达式产生异常表达式产生异常的值。

108、而且,该异常的值的类型必须为类型或者从类派的值。而且,该异常的值的类型必须为类型或者从类派生的类型。生的类型。C#从入门到实践从入门到实践6.4 6.4 选择语句选择语句选择语句是指根据表达式的值从假设干个给定的语句中选选择语句是指根据表达式的值从假设干个给定的语句中选择一个来执行的语句。选择语句包括择一个来执行的语句。选择语句包括if语句和语句和switch语句。语句。每一个每一个if语句的选择支只有语句的选择支只有2个,而每一个个,而每一个switch语句的语句的选择支可以为选择支可以为1个或多个。本节将详细介绍个或多个。本节将详细介绍if语句和语句和switch语句。语句。C#从入门到实

109、践从入门到实践6.4.1 if6.4.1 if语句语句if语句能够根据布尔表达式的值选择要执行的语句,它存在语句能够根据布尔表达式的值选择要执行的语句,它存在以下以下2种语法形式。种语法形式。if(布尔表达式布尔表达式) 嵌入语句嵌入语句;if(布尔表达式布尔表达式) 嵌入语句嵌入语句1; else嵌入语句嵌入语句2;C#从入门到实践从入门到实践6.4.2 switch6.4.2 switch语句语句switch语句比语句比if语句更加灵活,它可以存在语句更加灵活,它可以存在1个或多个可执个或多个可执行的选择支。它的语法形式如下:行的选择支。它的语法形式如下:switch(表达式表达式)cas

110、e常量表达式常量表达式1:语句块语句块1;case常量表达式常量表达式2:语句块语句块2;default: 语句块语句块n;C#从入门到实践从入门到实践6.5 6.5 迭代语句迭代语句迭代语句是指可以重复执行嵌入语句的语句,包括迭代语句是指可以重复执行嵌入语句的语句,包括for语句、语句、foreach语句、语句、while语句和语句和do语句。本节将详细介绍这语句。本节将详细介绍这4中迭代语句。中迭代语句。C#从入门到实践从入门到实践6.5.1 for6.5.1 for语句语句for语句首先计算一个初始化表达式序列,然后,当某个条语句首先计算一个初始化表达式序列,然后,当某个条件为真时,重复

111、执行相关的嵌入语句并计算一个迭代表件为真时,重复执行相关的嵌入语句并计算一个迭代表达式序列。达式序列。for语句的语法形式如下:语句的语法形式如下:for (初始化表达式初始化表达式; 条件表达式条件表达式; 迭代表达式迭代表达式) 嵌入语句嵌入语句;C#从入门到实践从入门到实践6.5.2 foreach6.5.2 foreach语句语句foreach语句用于枚举一个集合的元素,并对该集合中的每语句用于枚举一个集合的元素,并对该集合中的每个元素执行一次相关的嵌入语句。个元素执行一次相关的嵌入语句。foreach语句的语法形语句的语法形式如下:式如下:foreach (类型类型 迭代变量迭代变量

112、 in 表达式表达式) 嵌入语句嵌入语句;C#从入门到实践从入门到实践6.5.3 while6.5.3 while语句语句while语句能够按照不同条件执行一个嵌入语句零次或屡次,语句能够按照不同条件执行一个嵌入语句零次或屡次,它的语法形式如下:它的语法形式如下:while (布尔表达式布尔表达式) 嵌入语句嵌入语句;C#从入门到实践从入门到实践6.5.4 do6.5.4 do语句语句do语句和语句和while语句非常相似,它能够按照不同条件执行一语句非常相似,它能够按照不同条件执行一个嵌入语句一次或屡次。它的语法形式如下:个嵌入语句一次或屡次。它的语法形式如下:do 嵌入语句嵌入语句 whi

113、le (布尔表达式布尔表达式);如果布尔表达式的值为如果布尔表达式的值为true,那么执行嵌入语句。,那么执行嵌入语句。do语句语句按照如下规那么执行,执行的流程图如下图。按照如下规那么执行,执行的流程图如下图。C#从入门到实践从入门到实践6.6 6.6 其他语句其他语句其他语句主要包括其他语句主要包括try语句、语句、using语句、语句、lock语句、语句、checked语句、语句、unchecked语句等。本节将详细介绍这些语句等。本节将详细介绍这些语句的使用方法。语句的使用方法。C#从入门到实践从入门到实践6.6.1 try6.6.1 try语句语句try语句提供一种机制,可以用来捕捉

114、在块的执行期间发生的各种语句提供一种机制,可以用来捕捉在块的执行期间发生的各种异常。此外,异常。此外,try语句还能指定一个代码块,并保证当控制离语句还能指定一个代码块,并保证当控制离开开try语句时,总是先执行该代码。语句时,总是先执行该代码。一个一个try语句可能包含语句可能包含try块、块、catch块和块和finally块。块。try块一般包含块一般包含需要恢复或清理操作的代码,即有可能发生异常的代码。需要恢复或清理操作的代码,即有可能发生异常的代码。catch块一般包括出现异常时需要执行的响应代码。块一般包括出现异常时需要执行的响应代码。finally块块一般包括确保一定执行的代码,

115、如资源清理操作等。一般包括确保一定执行的代码,如资源清理操作等。对于一个对于一个try语句而言,语句而言,try块是必须的,而且只能是一个,块是必须的,而且只能是一个,catch块和块和finally块不是必须的。一个块不是必须的。一个try语句存在以下语句存在以下3种形式:种形式:l一个一个try块,后跟一个或多个块,后跟一个或多个catch块。块。l一个一个try块,后跟一个块,后跟一个finally块。块。l一个一个try块,后跟一个或多个块,后跟一个或多个catch块,后面再跟一个块,后面再跟一个finally块。块。C#从入门到实践从入门到实践6.6.2 using6.6.2 usi

116、ng语句语句using语句用来定义一个范围,并在该范围之外释放一个或语句用来定义一个范围,并在该范围之外释放一个或多个对象,即用于获取一个或多个资源,并执行一个语多个对象,即用于获取一个或多个资源,并执行一个语句,然后释放该资源。它的语法形式如下:句,然后释放该资源。它的语法形式如下:using (resource-acquisition) embedded-statementresource-acquisition用于获取一个或多个资源,表示该资源用于获取一个或多个资源,表示该资源的对象必须实现了的对象必须实现了System.IDisposable的类或结构。的类或结构。embedded-s

117、tatement为一个嵌入语句,当为一个嵌入语句,当using语句获取语句获取其资源之后,将执行该嵌入语句。其资源之后,将执行该嵌入语句。执行执行using语句时,一般包括语句时,一般包括3个步骤:获取资源、使用资个步骤:获取资源、使用资源和释放资源。源和释放资源。using语句最常见的形式如下所示。语句最常见的形式如下所示。using (ResourceType resource = expression) statementC#从入门到实践从入门到实践6.6.3 lock6.6.3 lock语句语句lock语句用于首先获取某个给定对象的互斥锁,即对该对语句用于首先获取某个给定对象的互斥锁,

118、即对该对象进行加锁。然后执行一个语句,最后释放该锁。它的象进行加锁。然后执行一个语句,最后释放该锁。它的语法形式如下:语法形式如下:lock (expression) embedded-statementexpression表示被加锁的对象,且必须为引用类型的对象;表示被加锁的对象,且必须为引用类型的对象;embedded-statement表示加锁过程中执行的语句。表示加锁过程中执行的语句。C#从入门到实践从入门到实践6.6.4 checked6.6.4 checked和和uncheckedunchecked语句语句checked语句和语句和unchecked语句用于控制整型算术运算和转语句

119、用于控制整型算术运算和转换的溢出检查上下文。换的溢出检查上下文。checked语句和语句和unchecked语句完语句完全等效于全等效于checked运算符和运算符和unchecked运算符第节。运算符第节。不同的是,不同的是,checked语句和语句和unchecked语句用于块,而不语句用于块,而不是表达式。是表达式。C#从入门到实践从入门到实践6.7 6.7 实例一:判断闰年实例一:判断闰年【实例【实例6-1】演示了使用】演示了使用if语句判断指定的年份是否为闰年。语句判断指定的年份是否为闰年。该功能由该功能由IsLeapYear(int year)静态函数静态函数year参数类型参数类

120、型为为int,表示年份实现。其中,判断指定的年份是否为,表示年份实现。其中,判断指定的年份是否为闰年的规那么如下。闰年的规那么如下。能被能被4整除而不能被整除而不能被100整除的年份,那么是闰年。整除的年份,那么是闰年。能被能被400整除的年份,那么是闰年。整除的年份,那么是闰年。不满足上述任何一个条件的年份,那么不是闰年。不满足上述任何一个条件的年份,那么不是闰年。C#从入门到实践从入门到实践6.8 6.8 小结小结本章主要介绍了本章主要介绍了C#语言中的语句,如根本语句、跳转语句、语言中的语句,如根本语句、跳转语句、选择语句、迭代语句、其他语句等。其中,读者要着重选择语句、迭代语句、其他语

121、句等。其中,读者要着重掌握根本语句、跳转语句、选择语句和迭代语句,为后掌握根本语句、跳转语句、选择语句和迭代语句,为后续编写续编写C#程序代码奠定根底。下一章将要介绍程序代码奠定根底。下一章将要介绍C#语言中语言中的命名空间。的命名空间。C#从入门到实践从入门到实践6.9 6.9 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_06的控制台应用的控制台应用程序,并实现以下功能。程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“IFStatem

122、ent的方法,且在该方法中使用的方法,且在该方法中使用if语句。语句。3创立一个名称为创立一个名称为“SwitchStatement的方法,且在该方法中使用的方法,且在该方法中使用switch语句。语句。4创立一个名称为创立一个名称为“ForStatement的方法,且在该方法中使用的方法,且在该方法中使用for语句。语句。5创立一个名称为创立一个名称为“ForeachStatement的方法,且在该方法中使用的方法,且在该方法中使用foreach语句。语句。6创立一个名称为创立一个名称为“WhileStatement的方法,且在该方法中使用的方法,且在该方法中使用while语句。语句。7创立

123、一个名称为创立一个名称为“DoStatement的方法,且在该方法中使用的方法,且在该方法中使用do语句。语句。8创立一个名称为创立一个名称为“TryStatement的方法,且在该方法中使用的方法,且在该方法中使用try语句。语句。C#从入门到实践从入门到实践第第7 7章章 命名空间命名空间C#语言的程序是利用命名空间语言的程序是利用命名空间namespace组织起来的,组织起来的,它为它为C#语言的类型系统提供唯一的完全限定名称。命名语言的类型系统提供唯一的完全限定名称。命名空间既用作程序的空间既用作程序的“内部组织系统,也用作内部组织系统,也用作“外部外部组织系统相对于其他程序而言的,一

124、种用来公开程序组织系统相对于其他程序而言的,一种用来公开程序本身所拥有元素的方法。本章将讲解本身所拥有元素的方法。本章将讲解C#语言的命名空语言的命名空间,主要介绍以下知识点。间,主要介绍以下知识点。声明命名空间;声明命名空间;.点号运算符;点号运算符;:双冒号运算符;双冒号运算符;using指令;指令;.NET Framework常用命名空间。常用命名空间。C#从入门到实践从入门到实践7.1 7.1 命名空间概述命名空间概述命名空间命名空间namespace是一种用于组织是一种用于组织C#程序代码中的程序代码中的不同类型的方式,并使类型具有唯一的完全限定名称。不同类型的方式,并使类型具有唯一

125、的完全限定名称。在概念上,命名空间和计算机文件系统中的文件夹比较在概念上,命名空间和计算机文件系统中的文件夹比较类似。命名空间具有以下类似。命名空间具有以下4个用途。个用途。组织大型代码工程。组织大型代码工程。使用使用.运算符将它们分隔。运算符将它们分隔。using指令不必为每个类指定命名空间的名称。指令不必为每个类指定命名空间的名称。global命名空间是命名空间是.NET Framework应用程序的应用程序的“根命名根命名空间,空间,global:System始终引用始终引用.NET Framework中的中的System命名空间。命名空间。C#从入门到实践从入门到实践7.2 7.2 声

126、明命名空间声明命名空间namespace关键字用于声明一个范围,并称该范围为命名空间。关键字用于声明一个范围,并称该范围为命名空间。通过命名空间可以组织程序的源代码,并为源代码提供一个通过命名空间可以组织程序的源代码,并为源代码提供一个全局唯一类型访问的方法。声明命名空间的具体语法如下。全局唯一类型访问的方法。声明命名空间的具体语法如下。namespace qualified-identifierbody;qualified-identifier表示命名空间的名称,该名称必须唯一,表示命名空间的名称,该名称必须唯一,body表示该命名空间的内容主体该局部是不可缺少的,表示该命名空间的内容主体该

127、局部是不可缺少的,;分分号是一个可选项。一旦声明了一个命名空间之后,该命名号是一个可选项。一旦声明了一个命名空间之后,该命名空间中的主体源代码将在该命名空间中进行编译。空间中的主体源代码将在该命名空间中进行编译。C#从入门到实践从入门到实践7.3 .7.3 .点号运算符点号运算符.点号运算符用于成员访问。在命名空间中,点号运算符用于成员访问。在命名空间中,.点号点号运算符指定命名空间的成员。【例如运算符指定命名空间的成员。【例如7-7】使用】使用.点点号运算符访问了号运算符访问了System命名空间下的命名空间下的Int32类型,并声类型,并声明了该类型的明了该类型的i变量。变量。System

128、.Int32 i;C#从入门到实践从入门到实践7.4 :7.4 :双冒号运算符双冒号运算符:双冒号运算符用于在指定命名空间中查找标识符,双冒号运算符用于在指定命名空间中查找标识符,它通常放置在两个标识符之间。【例如它通常放置在两个标识符之间。【例如7-10】使用】使用:双冒号运算符在双冒号运算符在global命名空间中查找类,并调用命名空间中查找类,并调用WriteLine()方法在控制台上显示方法在控制台上显示“This is a string.字符串。字符串。global:System.Console.WriteLine(This is a string.);注意:注意:global表示在

129、全局命名空间中的查找,而不是在个别表示在全局命名空间中的查找,而不是在个别特定的命名空间中查找。特定的命名空间中查找。C#从入门到实践从入门到实践7.5 using7.5 using指令指令using关键字存在两种常用用法:作为指令和作为语句。当关键字存在两种常用用法:作为指令和作为语句。当using关键字作为指令时,它用于为命名空间或类型创立关键字作为指令时,它用于为命名空间或类型创立别名或导入其他命名空间中定义的类型。当别名或导入其他命名空间中定义的类型。当using关键字关键字作为语句时,它用于定义一个范围,并在此范围的末尾作为语句时,它用于定义一个范围,并在此范围的末尾将释放对象。本节

130、介绍将释放对象。本节介绍using关键字作为指令的详细用法。关键字作为指令的详细用法。C#从入门到实践从入门到实践7.5.1 7.5.1 创立命名空间或类型别名创立命名空间或类型别名using指令可以为一个命名空间或类型创立特定的、简单的指令可以为一个命名空间或类型创立特定的、简单的别名,使得通过该别名也可以引用该命名空间或类型。别名,使得通过该别名也可以引用该命名空间或类型。具体语法如下:具体语法如下:using old-identifier = new- identifier;old-identifier表示命名空间或类型的旧名称,表示命名空间或类型的旧名称,new- identifier

131、表示该命名空间或类型的新名称,即别名。表示该命名空间或类型的新名称,即别名。C#从入门到实践从入门到实践7.5.2 7.5.2 导入命名空间导入命名空间using指令还可以将一个命名空间中所包含的类型导入到指指令还可以将一个命名空间中所包含的类型导入到指定的程序体或文件中,从而该程序体或文件中的代码可定的程序体或文件中,从而该程序体或文件中的代码可以直接访问该命名空间中的类型,而不需要加上类型的以直接访问该命名空间中的类型,而不需要加上类型的完全限定符如命名空间的名称。具体语法如下:完全限定符如命名空间的名称。具体语法如下:using identifier;identifier表示被导入的命名

132、空间。表示被导入的命名空间。C#从入门到实践从入门到实践7.6 .NET Framework7.6 .NET Framework常用命名空间常用命名空间Microsoft .NET Framework类库类库Class Library是一个是一个综合性的面向对象的可重用类型集合,由综合性的面向对象的可重用类型集合,由.NET Framework SDK中的类、接口、值类型等组成的库。中的类、接口、值类型等组成的库。.NET Framework类库是创立类库是创立.NET Framework应用程序、应用程序、组件和控件的根底,并为开发人员提供了大量的命名空组件和控件的根底,并为开发人员提供了大

133、量的命名空间、类等根底技术。间、类等根底技术。C#从入门到实践从入门到实践7.7 7.7 小结小结本章主要介绍了本章主要介绍了C#语言中的命名空间,如声明命名空间、语言中的命名空间,如声明命名空间、.点号运算符、点号运算符、:双冒号运算符、双冒号运算符、using指令、指令、.NET Framework常用命名空间等。其中,读者要着重掌常用命名空间等。其中,读者要着重掌握声明命名空间、握声明命名空间、using指令和指令和.NET Framework常用命常用命名空间,为后续编写名空间,为后续编写C#程序代码奠定根底。下一章将要程序代码奠定根底。下一章将要介绍介绍C#语言中的类。语言中的类。C

134、#从入门到实践从入门到实践7.8 7.8 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_07的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2设置文件的命名空间为设置文件的命名空间为“MyTest_07_01。3将名称为将名称为“class2.cs的文件添加到该应用程序中。的文件添加到该应用程序中。4设置文件的命名空间为设置文件的命名空间为“MyTest_07_02。C#从入门到实践从入门到实践第第8 8章章 类类C#是面向

135、对象的编程语言,它使用类和结构来实现类型是面向对象的编程语言,它使用类和结构来实现类型如如Windows窗体、窗体、ASP.NET Web窗体、用户界面控件等窗体、用户界面控件等。典型的。典型的C#应用程序由程序员定义的类和应用程序由程序员定义的类和.NET Framework的类组成。本章将讲解的类组成。本章将讲解C#语言中的类,主要语言中的类,主要介绍以下知识点。介绍以下知识点。类概述;类概述;类数据成员;类数据成员;类函数成员类函数成员创立派生类;创立派生类;展示类的多态性。展示类的多态性。C#从入门到实践从入门到实践8.1 8.1 类概述类概述类类class是一种数据结构,它可以包含数

136、据成员常量是一种数据结构,它可以包含数据成员常量和字段、函数成员方法、属性、事件、索引器、运和字段、函数成员方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数以及算符、实例构造函数、静态构造函数和析构函数以及嵌套类型。类类型支持继承,继承是一种机制,它使派嵌套类型。类类型支持继承,继承是一种机制,它使派生类可以对基类进行扩展和专用化。生类可以对基类进行扩展和专用化。C#从入门到实践从入门到实践8.1.1 8.1.1 类声明类声明声明类需要使用声明类需要使用class关键字,语法如下。关键字,语法如下。class-modifiers class identifier clas

137、s-base class-body ;class-modifiers表示类修饰符可选,表示类修饰符可选,identifier表示类的表示类的名称,名称,class-base表示类的基类或接口等可选,表示类的基类或接口等可选,class-body表示类体,表示类体,;分号是可选的。分号是可选的。C#从入门到实践从入门到实践8.1.2 8.1.2 类修饰符类修饰符类修饰符放在类修饰符放在class关键字的前面,它包括关键字的前面,它包括new、public、protected、internal、private、abstract和和sealed共共7个关键个关键字。其中,字。其中,public、pr

138、otected、internal和和private修饰符控修饰符控制类的可访问性。它们的意义具体说明如下。制类的可访问性。它们的意义具体说明如下。lpublic修饰符表示该类是公开的,访问不受限制。修饰符表示该类是公开的,访问不受限制。lprotected修饰符表示该类只能是本身或其派生的类访问。修饰符表示该类只能是本身或其派生的类访问。linternal修饰符表示该类只能是在当前应用程序中访问。修饰符表示该类只能是在当前应用程序中访问。lprivateprivate修饰符表示该类只能是本身访问。修饰符表示该类只能是本身访问。C#从入门到实践从入门到实践8.1.3 8.1.3 类继承类继承类类

139、型支持继承类类型支持继承inherit,继承是一种机制,它使派生,继承是一种机制,它使派生类可以对基类进行扩展和专用化。在类声明语法中,类可以对基类进行扩展和专用化。在类声明语法中,class-base表示类的基类或接口等可选,即一个类可表示类的基类或接口等可选,即一个类可以从另外一个类继承而来。以从另外一个类继承而来。C#从入门到实践从入门到实践8.1.4 8.1.4 类、对象和实例化类、对象和实例化类是一种数据结构,它为动态创立类的实例提供了定义。类是一种数据结构,它为动态创立类的实例提供了定义。类的实例又称为对象。实例化是一种操作,它可以为类类的实例又称为对象。实例化是一种操作,它可以为

140、类的实例分配内存。的实例分配内存。C#从入门到实践从入门到实践8.2 8.2 类成员类成员类可以包含多种成员,如常量、字段、方法等,具体说明如下。类可以包含多种成员,如常量、字段、方法等,具体说明如下。1常量常量2字段字段3方法方法4属性属性5事件事件6索引器索引器7运算符运算符8实例构造函数实例构造函数9析构函数析构函数10静态构造函数静态构造函数11类型类型上述成员除了类型之外,可以分类两大类:数据成员和函数成员。上述成员除了类型之外,可以分类两大类:数据成员和函数成员。其中,数据成员包括常量和字段;函数成员包括方法、属性、其中,数据成员包括常量和字段;函数成员包括方法、属性、事件、索引器

141、、运算符、实例构造函数、析构函数和该类的事件、索引器、运算符、实例构造函数、析构函数和该类的静态构造函数。本节将详细介绍上述类的成员。静态构造函数。本节将详细介绍上述类的成员。C#从入门到实践从入门到实践8.2.1 8.2.1 常量常量常量常量constant用来表示常数值,它的值在编译时计算。用来表示常数值,它的值在编译时计算。常量的类型必须为常量的类型必须为sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。、枚举类型或引用类型。在声明常量时,需要使用在声明常

142、量时,需要使用const关键字。关键字。C#从入门到实践从入门到实践8.2.2 8.2.2 字段字段字段字段field是类中最为常见的数据成员,它为类中的变是类中最为常见的数据成员,它为类中的变量。如果在同一个语句中同时声明多个字段,那么字段量。如果在同一个语句中同时声明多个字段,那么字段之间需要使用之间需要使用,逗号分隔。根据字段的修饰方式,逗号分隔。根据字段的修饰方式,可以把字段分为以下可以把字段分为以下4种。种。静态字段,使用静态字段,使用static修饰,对应于静态变量。修饰,对应于静态变量。实例字段,不使用实例字段,不使用static修饰,对应于实例变量。修饰,对应于实例变量。只读字

143、段,使用只读字段,使用readonly修饰。修饰。易失字段,使用易失字段,使用volatile修饰。该类型的字段很少使用,在修饰。该类型的字段很少使用,在此不做详细介绍。此不做详细介绍。C#从入门到实践从入门到实践8.2.3 8.2.3 方法方法方法方法method是包含一系列语句的代码块,通过这些代是包含一系列语句的代码块,通过这些代码块能够实现预先定义的计算或操作。方法一般声明在码块能够实现预先定义的计算或操作。方法一般声明在类或结构中,由访问级别、返回值、方法名称、方法参类或结构中,由访问级别、返回值、方法名称、方法参数和方法体组成。其中,访问级别、返回值、方法名称数和方法体组成。其中,

144、访问级别、返回值、方法名称和方法参数统称为方法的和方法参数统称为方法的“签名。方法参数包括在小签名。方法参数包括在小括弧括弧“中,多个参数使用中,多个参数使用,逗号分隔。逗号分隔。如果为空括号,那么表示该方法不需要参数。如果为空括号,那么表示该方法不需要参数。1方法参数方法参数2静态方法和实例方法静态方法和实例方法3虚方法和重写方法虚方法和重写方法4密封方法密封方法5抽象方法抽象方法C#从入门到实践从入门到实践8.2.4 8.2.4 属性属性属性属性property是是C#语言所特有的一种机制,它可以用语言所特有的一种机制,它可以用于访问对象或类的特性的成员。属性和字段非常相似,于访问对象或类

145、的特性的成员。属性和字段非常相似,而且访问属性和字段的语法相同。但是,属性不表示存而且访问属性和字段的语法相同。但是,属性不表示存储位置字段表示一个存储位置。储位置字段表示一个存储位置。属性通过一种被称为访问器的机制来获取或修改其值。其属性通过一种被称为访问器的机制来获取或修改其值。其中,获取属性的值的访问器为称为中,获取属性的值的访问器为称为get访问器,修改属性访问器,修改属性的值的访问器被称为的值的访问器被称为set访问器,它们的具体说明如下:访问器,它们的具体说明如下:get访问器相当于一个无参数方法,且该访问的返回值的类访问器相当于一个无参数方法,且该访问的返回值的类型和属性的类型相

146、同。在型和属性的类型相同。在get访问器中,必须包含访问器中,必须包含return语句,返回该属性的值。语句,返回该属性的值。set访问器相当于一个返回类型为访问器相当于一个返回类型为void的方法,且该方法只的方法,且该方法只有一个参数,参数的类型和属性的类型相同。特别地,有一个参数,参数的类型和属性的类型相同。特别地,该方法的参数名称始终约定为该方法的参数名称始终约定为value。C#从入门到实践从入门到实践8.2.5 8.2.5 索引器索引器索引器索引器indexer其实是一种含有参数的属性,又称为含其实是一种含有参数的属性,又称为含参属性。它提供索引的方式来访问对象,即与数组的访参属性

147、。它提供索引的方式来访问对象,即与数组的访问方式相同。声明索引器时,需要使用问方式相同。声明索引器时,需要使用this关键字。关键字。C#从入门到实践从入门到实践8.2.6 8.2.6 构造函数构造函数构造函数是类的一种特定的方法,它的名称和其所属类的构造函数是类的一种特定的方法,它的名称和其所属类的名称相同。构造函数是在创立给定类型的对象时执行的名称相同。构造函数是在创立给定类型的对象时执行的类方法,通常用来初始化新对象的数据成员,即设置数类方法,通常用来初始化新对象的数据成员,即设置数据成员的默认值。在任何时候,只要创立类,就会调用据成员的默认值。在任何时候,只要创立类,就会调用它的构造函

148、数。如果开发人员没有为类显式提供构造函它的构造函数。如果开发人员没有为类显式提供构造函数,那么默认情鱿数,那么默认情鱿C#编译器将为该类创立一个默认的构编译器将为该类创立一个默认的构造函数造函数1实例构造函数实例构造函数2静态构造函数静态构造函数C#从入门到实践从入门到实践8.2.7 8.2.7 析构函数析构函数析构函数析构函数destructor是一种用于实现销毁类实例所需操是一种用于实现销毁类实例所需操作的成员。它和类的构造函数恰恰相反,类的构造函数作的成员。它和类的构造函数恰恰相反,类的构造函数用来初始化该类的实例,而析构函数用来释放该类的实用来初始化该类的实例,而析构函数用来释放该类的

149、实例占用的资源,并销毁该类的实例。例占用的资源,并销毁该类的实例。析构函数的名称和类的名称一样,并带有析构函数的名称和类的名称一样,并带有“字符。字符。C#从入门到实践从入门到实践8.2.8 8.2.8 事件事件事件事件event是一种使对象或类能够提供通知的成员。客是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序户端可以通过提供事件处理程序event handler为相为相应的事件添加可执行代码。类或对象可以通过事件向其应的事件添加可执行代码。类或对象可以通过事件向其他类或对象通知发生的相关事情。他类或对象通知发生的相关事情。一个类或对象可以事先向其他类或对象注册一个事件,

150、然一个类或对象可以事先向其他类或对象注册一个事件,然后在一定的时候引发该事件。如开发人员可以向在后在一定的时候引发该事件。如开发人员可以向在Windows窗体中的按钮注册一个事件,当用户单击该按窗体中的按钮注册一个事件,当用户单击该按钮时,将引发该已注册的事件。有关事件的知识点将在钮时,将引发该已注册的事件。有关事件的知识点将在第第12章中详细介绍。章中详细介绍。C#从入门到实践从入门到实践8.3 8.3 实例一:使用类的继承特性实例一:使用类的继承特性本实例创立了本实例创立了3个类:个类:Person、Teacher和和Student。Teacher和和Student类都继承与类都继承与Pe

151、rson类,它们的继承关系如下图。类,它们的继承关系如下图。C#从入门到实践从入门到实践8.3.1 8.3.1 设计设计PersonPerson类类Person类包含类包含3个字段:个字段:name、age和和courses。其中,。其中,name字段表示姓名,类型为字段表示姓名,类型为string;age字段表示年龄,字段表示年龄,类型为类型为int;courses字段表示课程列表,它为一个元素类字段表示课程列表,它为一个元素类型为型为string的数组。的数组。C#从入门到实践从入门到实践8.3.2 8.3.2 设计设计TeacherTeacher类类Teacher类继承于类继承于Pers

152、on类,且还包含类,且还包含1个字段:个字段:duty。该。该字段表示职务,类型为字段表示职务,类型为string。C#从入门到实践从入门到实践8.3.3 8.3.3 设计设计StudentStudent类类Student类继承于类继承于Person类,且还包含类,且还包含1个字段:个字段:className。该字段表示班级,类型为。该字段表示班级,类型为string。C#从入门到实践从入门到实践8.3.4 8.3.4 测试测试PersonPerson、TeacherTeacher和和StudentStudent类类【实例【实例8-1】测试】测试Person、Teacher和和Student类

153、,并介绍了类,并介绍了类的使用方法。类的使用方法。C#从入门到实践从入门到实践8.4 8.4 小结小结本章主要介绍了本章主要介绍了C#语言中的类,如类概述、类数据成员、语言中的类,如类概述、类数据成员、类函数成员、派生类、多态性等。其中,读者要着重掌类函数成员、派生类、多态性等。其中,读者要着重掌握类的数据成员和函数成员,以及使用类的派生和多态握类的数据成员和函数成员,以及使用类的派生和多态性来创立派生类的方法,为后续编写性来创立派生类的方法,为后续编写C#程序代码奠定根程序代码奠定根底。下一章将要介绍底。下一章将要介绍C#语言中的结构。语言中的结构。C#从入门到实践从入门到实践8.5 8.5

154、 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_08的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“MyClass的类,并在该类中定义的类,并在该类中定义如下成员。如下成员。sum常量;常量;value字段;字段;GetValue()方法;方法;Index属性;属性;只包含一个类型为只包含一个类型为int的参数、且返回类型为的参数、且返回类型为string的索引器;的索引器;printHand

155、ler事件。事件。C#从入门到实践从入门到实践第第9 9章章 结构结构结构和类非常相似。和类相比,结构更加适合用于表示轻结构和类非常相似。和类相比,结构更加适合用于表示轻量级对象如复数、坐标、矩阵、颜色等。通过结构,量级对象如复数、坐标、矩阵、颜色等。通过结构,只要使用少量数据成员,就能够表示这些轻量级对象,只要使用少量数据成员,就能够表示这些轻量级对象,从而简化了应用程序。本章将讲解从而简化了应用程序。本章将讲解C#语言中的结构,主语言中的结构,主要介绍以下知识点。要介绍以下知识点。结构概述;结构概述;结构成员;结构成员;结构和类的区别结构和类的区别创立创立Point结构;结构;创立创立Co

156、mplex结构。结构。C#从入门到实践从入门到实践9.1 9.1 结构概述结构概述结构结构struct与类非常相似,它们都表示可以包含数据成与类非常相似,它们都表示可以包含数据成员常量和字段和函数成员方法、属性、事件、索员常量和字段和函数成员方法、属性、事件、索引器、运算符、实例构造函数和静态构造函数的数据引器、运算符、实例构造函数和静态构造函数的数据结构。但是,结构是一种值类型,结构类型的变量直接结构。但是,结构是一种值类型,结构类型的变量直接包含了该结构的数据。类类型是一种引用类型,类类型包含了该结构的数据。类类型是一种引用类型,类类型的变量仅仅包含访问某个数据的一个引用或地罚的变量仅仅包

157、含访问某个数据的一个引用或地罚1结构声明结构声明2结构修饰符结构修饰符C#从入门到实践从入门到实践9.2 9.2 结构成员结构成员结构和类一样,它也包含多种成员,如常量、字段、方法等,具体说明结构和类一样,它也包含多种成员,如常量、字段、方法等,具体说明如下。如下。l常量常量l字段字段l方法方法l属性属性l事件事件l索引器索引器l运算符运算符l实例构造函数实例构造函数l静态构造函数静态构造函数l类型类型上述成员除了类型之外,可以分类两大类:数据成员和函数成员。其中,上述成员除了类型之外,可以分类两大类:数据成员和函数成员。其中,数据成员包括常量和字段;函数成员包括方法、属性、事件、索引数据成员

158、包括常量和字段;函数成员包括方法、属性、事件、索引器、运算符、实例构造函数和静态构造函数。器、运算符、实例构造函数和静态构造函数。C#从入门到实践从入门到实践9.3 9.3 结构和类的区别结构和类的区别结构和类虽然比较相似,但是还存在以下结构和类虽然比较相似,但是还存在以下8个方面的区别。个方面的区别。结构是值类型,并隐式地从类结构是值类型,并隐式地从类System.ValueType继承,而类是引用类型,并从类继承,而类是引用类型,并从类object继承。继承。结构总是分配在堆栈上,而类常常分配在堆上。如果对结构类型的变量进行赋值,结构总是分配在堆栈上,而类常常分配在堆上。如果对结构类型的变

159、量进行赋值,那么将创立所赋的值的一个副本。那么将创立所赋的值的一个副本。结构类型字段的默认值是字段本身的类型的默认值,而类类型字段的默认值为结构类型字段的默认值是字段本身的类型的默认值,而类类型字段的默认值为null。因此,结构是存在默认值的。因此,结构是存在默认值的。结构不能声明无参数的实例构造函数。结构不能声明无参数的实例构造函数。结构不能声明析构函数。结构不能声明析构函数。在结构中,初始化实例字段是错误的。在结构中,初始化实例字段是错误的。对于结构而言,不像类那样存在继承。一个结构不能从另一个结构或类继承,而对于结构而言,不像类那样存在继承。一个结构不能从另一个结构或类继承,而且不能作为

160、一个类的基。但是,结构从基类且不能作为一个类的基。但是,结构从基类Object继承。结构可实现接口,继承。结构可实现接口,其方式同类完全一样。其方式同类完全一样。实例化结构时,可以不使用实例化结构时,可以不使用new运算符,而且结构对象的字段具有默认初始值。运算符,而且结构对象的字段具有默认初始值。而实例化类时,必须使用而实例化类时,必须使用new运算符,并需要设置各个字段的初始值。运算符,并需要设置各个字段的初始值。C#从入门到实践从入门到实践9.3.1 9.3.1 继承继承结构不支持继承。因此,在声明结构成员时,不能使用结构不支持继承。因此,在声明结构成员时,不能使用protected或或

161、protected internal修饰符。结构类型永远不修饰符。结构类型永远不会是抽象的,并且始终是隐式密封的。因此,结构不能会是抽象的,并且始终是隐式密封的。因此,结构不能作为其他结构或类的基结构,而且在声明结构时,不能作为其他结构或类的基结构,而且在声明结构时,不能使用使用abstract或或sealed修饰符。修饰符。C#从入门到实践从入门到实践9.3.2 this9.3.2 this保存字保存字this是一个保存字,它只能在实例构造函数、实例方法或实是一个保存字,它只能在实例构造函数、实例方法或实例访问器的块中使用,且表示当前实例。在类中,例访问器的块中使用,且表示当前实例。在类中,

162、this表示当前实例,它的值不能被修改。在结构中,表示当前实例,它的值不能被修改。在结构中,this相相当于一个变量。如果在结构的实例构造函数中,当于一个变量。如果在结构的实例构造函数中,this相相当于一个结构类型的当于一个结构类型的out参数;如果在结构的实例函数成参数;如果在结构的实例函数成员中,员中,this相当于一个结构类型的相当于一个结构类型的ref参数。参数。C#从入门到实践从入门到实践9.3.3 9.3.3 构造函数构造函数在结构中,不能声明无参数的实例构造函数。其实,每一在结构中,不能声明无参数的实例构造函数。其实,每一个结构都隐式地具有一个无参数实例构造函数,该构造个结构都

163、隐式地具有一个无参数实例构造函数,该构造函数将初始化该结构所有字段的值。如果字段的类型为函数将初始化该结构所有字段的值。如果字段的类型为值类型,那么将该字段的值设置为其类型的默认值。如值类型,那么将该字段的值设置为其类型的默认值。如果字段的类型为引用类型,那么将该字段的值设置为果字段的类型为引用类型,那么将该字段的值设置为null。另外,结构还可以声明带有参数的实例构造函数。另外,结构还可以声明带有参数的实例构造函数。C#从入门到实践从入门到实践9.4 9.4 实例一:创立坐标点结构实例一:创立坐标点结构PointPoint本实例创立一个名称为本实例创立一个名称为Point的结构,用来表示二维

164、坐标值。的结构,用来表示二维坐标值。该结构包含该结构包含2个属性:个属性:X和和Y,它们分别表示,它们分别表示X坐标值和坐标值和Y坐标值。坐标值。C#从入门到实践从入门到实践9.4.1 9.4.1 设计设计PointPoint结构结构Point结构包含结构包含2个字段:个字段:x和和y。其中,。其中,x字段表示字段表示X坐标的坐标的值,值,y字段表示字段表示Y坐标的值,它们的类型都为坐标的值,它们的类型都为int。C#从入门到实践从入门到实践9.4.2 9.4.2 测试测试PointPoint结构结构【实例【实例9-1】测试了】测试了Point结构,并使用该结构创立一个实例结构,并使用该结构创

165、立一个实例p,然后显示该实例的,然后显示该实例的X坐标和坐标和Y坐标的值。坐标的值。C#从入门到实践从入门到实践9.5 9.5 实例二:创立复数结构实例二:创立复数结构ComplexComplex本实例创立一个名称为本实例创立一个名称为Complex的结构,用来表示一个复的结构,用来表示一个复数。该结构包含数。该结构包含2个属性:个属性:Integer和和Fraction,它们分别,它们分别表示复数的整数局部和小数局部。另外,该结构重载了表示复数的整数局部和小数局部。另外,该结构重载了+运算符,并使用该运算符计算了两个复数的和。运算符,并使用该运算符计算了两个复数的和。C#从入门到实践从入门到

166、实践9.5.1 9.5.1 设计设计ComplexComplex结构结构Complex结构包含结构包含2个字段:个字段:integer和和fraction。其中,。其中,integer字段表示复数的整数局部,字段表示复数的整数局部,fraction字段表示复数字段表示复数的小数局部,它们的类型都为的小数局部,它们的类型都为int。C#从入门到实践从入门到实践9.5.2 9.5.2 测试测试ComplexComplex结构结构【实例【实例9-2】测试了】测试了Complex结构,并使用该结构创立两个结构,并使用该结构创立两个实例实例lc和和rc,然后计算这两个实例的和,并显示计算结,然后计算这两

167、个实例的和,并显示计算结果。果。C#从入门到实践从入门到实践9.6 9.6 小结小结本章主要介绍了本章主要介绍了C#语言中的结构,如结构概述、结构成员、语言中的结构,如结构概述、结构成员、结构和类的区别、结构和类的区别、Point结构、结构、Complex结构等。其中,结构等。其中,读者要着重掌握结构的成员,以及创立结构的方法,为读者要着重掌握结构的成员,以及创立结构的方法,为后续编写后续编写C#程序代码奠定根底。下一章将要介绍程序代码奠定根底。下一章将要介绍C#语言语言中的数组。中的数组。C#从入门到实践从入门到实践9.7 9.7 习题习题在在Visual Studio 2021集成开发环境

168、中创立名称为集成开发环境中创立名称为“Test_09的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“MyStruct的类,并在该类中定义的类,并在该类中定义如下成员。如下成员。sum常量;常量;value字段;字段;GetValue()方法;方法;Index属性;属性;只包含一个类型为只包含一个类型为int的参数、且返回类型为的参数、且返回类型为string的索引器;的索引器;printHandler事件。事件。C#从入门到实践从入门到实践第第1010章

169、章 数组数组数组可以将多个类型相同的元素组合为一个整体,从而通数组可以将多个类型相同的元素组合为一个整体,从而通过数组统一访问或操作这些元素。数组是过数组统一访问或操作这些元素。数组是C#语言最常用语言最常用的数据结构之一。它是相同数据类型的对象的集合。该的数据结构之一。它是相同数据类型的对象的集合。该集合的长度即数组的长度可以为集合的长度即数组的长度可以为0或大于或大于0的整数。的整数。本章将讲解使用数组进行编程的方法,主要介绍以下知本章将讲解使用数组进行编程的方法,主要介绍以下知识点。识点。数组概述;数组概述;数组分类;数组分类;静态数组;静态数组;动态数组;动态数组;抽签程序。抽签程序。

170、C#从入门到实践从入门到实践10.1 10.1 数组概述数组概述数组是一个有序的数据集合。数组中的每一个元素的数据数组是一个有序的数据集合。数组中的每一个元素的数据类型都相同。元素的数据类型被称为元素类型,它可以类型都相同。元素的数据类型被称为元素类型,它可以为任何类型,甚至可以为数组。数组可以用一个统一的为任何类型,甚至可以为数组。数组可以用一个统一的数组名和下标来唯一确定组中的元素。例如,一个班有数组名和下标来唯一确定组中的元素。例如,一个班有50名学生,可以用名学生,可以用s1、s2、s3、s50表示表示50个学生的个学生的成绩。成绩。s为数组名,下标表示学生的序号。为数组名,下标表示学

171、生的序号。s10整数整数10为下标表示第为下标表示第10个学生的成绩。个学生的成绩。C#从入门到实践从入门到实践10.1.1 10.1.1 数组的维度数数组的维度数大家都知道,直线由点构成,平面由直线构成、空间由平大家都知道,直线由点构成,平面由直线构成、空间由平面构成。如果要描述直线上的一个点,那么只需要一个面构成。如果要描述直线上的一个点,那么只需要一个值。如果要描述平面上的一个点,那么需要两个值。如值。如果要描述平面上的一个点,那么需要两个值。如果要描述空间中的一个点,那么需要果要描述空间中的一个点,那么需要3个值。在直线、个值。在直线、平面和空间中,称描述一个点所需要值的数量为平面和空

172、间中,称描述一个点所需要值的数量为“维度维度数。数。数组也一样,它也存在维度数的概念。当在要描述数组中数组也一样,它也存在维度数的概念。当在要描述数组中的一个元素时,如果只需要一个值数组的下标,那的一个元素时,如果只需要一个值数组的下标,那么该数组的维度数为么该数组的维度数为1;如果需要两个值,那么该数组;如果需要两个值,那么该数组的维度数为的维度数为2;依次类推。如上述提及的;依次类推。如上述提及的s数组的维度数数组的维度数就是就是1。根据数组的维度数不同,可以把数组分为以下。根据数组的维度数不同,可以把数组分为以下3种类型种类型一维数组,维度数为一维数组,维度数为1的数组。的数组。二维数组

173、,维度数为二维数组,维度数为2的数组。的数组。多维数组,维度数大于多维数组,维度数大于2的数组。的数组。C#从入门到实践从入门到实践10.1.2 10.1.2 声明数组声明数组在在C#程序设计中,如果需要某一个数组,那么必须首先声程序设计中,如果需要某一个数组,那么必须首先声明该数组。声明一维数组的语法如下所示。明该数组。声明一维数组的语法如下所示。type arrayName;其中,其中,type表示数组元素的类型,如表示数组元素的类型,如int、double、string、object等;等;arrayName表示数组的名称。表示数组的名称。C#从入门到实践从入门到实践10.1.3 10.

174、1.3 实例化数组实例化数组实例化数组就是为数组分配相应的内存。注意,声明一个实例化数组就是为数组分配相应的内存。注意,声明一个数组,并不为该数组分配相应的内存。数组,并不为该数组分配相应的内存。C#从入门到实践从入门到实践10.1.4 10.1.4 初始化数组初始化数组初始化数组就是初始化数组中每一个元素的值,即为数组初始化数组就是初始化数组中每一个元素的值,即为数组中的每一个元素进行赋值。数组被实例化之后,每个元中的每一个元素进行赋值。数组被实例化之后,每个元素都为其元素类型的默认值。一般情况下,只有初始化素都为其元素类型的默认值。一般情况下,只有初始化数组之后,该数组才具有实际运算的意义

175、。初始化数组数组之后,该数组才具有实际运算的意义。初始化数组存有多种方法,主要包括以下存有多种方法,主要包括以下4种。种。1直接赋值直接赋值2使用使用“new操作符,并指定了数组的长度操作符,并指定了数组的长度3使用使用“new操作符,省略数组的长度操作符,省略数组的长度4直接设置数组的每一个元素的值直接设置数组的每一个元素的值C#从入门到实践从入门到实践10.1.5 10.1.5 遍历数组遍历数组遍历数组是指依次访问数组中的每一个元素,并执行预先遍历数组是指依次访问数组中的每一个元素,并执行预先设计的操作。访问数组的元素最常用方法之一就是使用设计的操作。访问数组的元素最常用方法之一就是使用下

176、标或索引。根据是否使用下标可以遍历数组方式下标或索引。根据是否使用下标可以遍历数组方式分为两种。第一种,使用下标遍历,如分为两种。第一种,使用下标遍历,如for、while、dowhile等语句。第二种,不使用下标遍历,如等语句。第二种,不使用下标遍历,如foreach语句。语句。1使用下标遍历数组使用下标遍历数组2不使用下标遍历数组不使用下标遍历数组C#从入门到实践从入门到实践10.2 10.2 数组分类数组分类根据数组的维度数和元素的类型不同,可以把数组分为根据数组的维度数和元素的类型不同,可以把数组分为4种种类型:一维数组维度数为类型:一维数组维度数为1的数组、二维数组维的数组、二维数组

177、维度数为度数为2的数组、多维数组维度数大于的数组、多维数组维度数大于2的数组和的数组和交错数组元素的类型为数组的数组。本小节将介绍交错数组元素的类型为数组的数组。本小节将介绍声明、实例化和初始化各种不同类型数组的方法。声明、实例化和初始化各种不同类型数组的方法。C#从入门到实践从入门到实践10.2.1 10.2.1 一维数组一维数组一维数组是指维度数为一维数组是指维度数为1的数组,它是最简单的数组,也是的数组,它是最简单的数组,也是最常用的数组。声明一维数组的语法如下所示。最常用的数组。声明一维数组的语法如下所示。type arrayName;其中,其中,type表示数组元素的类型,如表示数组

178、元素的类型,如int、double、string、object等;等;arrayName表示数组的名称。表示数组的名称。C#从入门到实践从入门到实践10.2.2 10.2.2 二维数组二维数组二维数组是指维度数为二维数组是指维度数为2的数组。声明二维数组的语法如下的数组。声明二维数组的语法如下所示。所示。type, arrayName;其中,其中,type表示数组元素的类型,如表示数组元素的类型,如int、double、string、object等;中括号等;中括号中间存在一个逗号中间存在一个逗号,表示该表示该数组为一个二维数组;数组为一个二维数组;arrayName表示数组的名称。表示数组的

179、名称。C#从入门到实践从入门到实践10.2.3 10.2.3 多维数组多维数组多维数组是指维度数大于多维数组是指维度数大于2的数组,如三维数组、四维数组的数组,如三维数组、四维数组等。声明三维数组的语法如下所示。等。声明三维数组的语法如下所示。type, , arrayName;其中,其中,type表示数组元素的类型,如表示数组元素的类型,如int、double、string、object等;中括号等;中括号中间存在两个逗号中间存在两个逗号,表示该表示该数组为一个三维数组;数组为一个三维数组;arrayName表示数组的名称。表示数组的名称。C#从入门到实践从入门到实践10.2.4 10.2.

180、4 交错数组交错数组交错数组又称为交错数组又称为“数组的数组,它的元素也为一个数组。数组的数组,它的元素也为一个数组。声明二维交错数组的语法如下所示。声明二维交错数组的语法如下所示。type arrayName;其中,其中,type表示数组元素的类型,如表示数组元素的类型,如int、double、string、object等;等;type关键字之后包含两个中括号关键字之后包含两个中括号表示该表示该数组为一个二维交错数组;数组为一个二维交错数组;arrayName表示数组的名称。表示数组的名称。C#从入门到实践从入门到实践10.3 10.3 静态数组静态数组.NET框架提供了两种数组:静态数组和

181、动态数组。一旦为框架提供了两种数组:静态数组和动态数组。一旦为数组分配内存之后,如果该数组的大小是不能修改的,数组分配内存之后,如果该数组的大小是不能修改的,那么称该数组为静态数组;反之,那么称之为动态数组。那么称该数组为静态数组;反之,那么称之为动态数组。静态数组静态数组由类实现,动态数组由静态数组静态数组由类实现,动态数组由System.ArrayList类实现。本小节将介绍静态数组的根类实现。本小节将介绍静态数组的根本属性和方法,以及它们的使用方法。本属性和方法,以及它们的使用方法。注意:本章前面小节所介绍的数组都是属于静态数组。注意:本章前面小节所介绍的数组都是属于静态数组。C#从入门

182、到实践从入门到实践10.3.1 10.3.1 属性属性类包含类包含7个属性,如获取数组长度的个属性,如获取数组长度的Length属性、获取数组秩的属性、获取数组秩的Rank等,如表所示。等,如表所示。属性描述Length数组的长度,即数组所有维度中元素的总数。该值为32位整数。LongLength数组的长度,即数组所有维度中元素的总数。该值为64位整数。Rank数组的秩,即数组的维度数。IsFixedSize表示数组的大小是否固定。IsReadOnly表示数组是否为只读。IsSynchronized表示是否同步访问数组。SyncRoot获取同步访问数组的对象。C#从入门到实践从入门到实践10.

183、3.2 10.3.2 方法方法类包含多个方法,如获取数组长度的类包含多个方法,如获取数组长度的GetLength()方法、获取指定方法、获取指定元素值的元素值的GetValue()方法,获取指定元素索引的方法,获取指定元素索引的IndexOf()方法等,方法等,如表所示。如表所示。属性描述GetValue()获取指定元素的值。SetValue()设置指定元素的值。Clear()清空数组中的所有元素。GetLength()获取指定维的元素数量。该值为32位整数。GetLongLength()获取指定维的元素数量。该值为64位整数。IndexOf()获取匹配的第一个元素的索引。LastIndexO

184、f()获取匹配的最后一个元素的索引。FindIndex()搜索指定元素,并获取第一个匹配元素的索引。FindLastIndex()搜索指定元素,并获取最后一个匹配元素的索引。Copy()将一个数组中的一部分元素复制到另一个数组。CopyTo()将一维数组的所有元素复制到另外一个一维数组。Clone()复制数组。ConstrainedCopy()指定开始位置,并复制一系列元素到另外一个数组中。Sort()对一维数组中的元素进行排序。Reverse()反转一维数组中元素的顺序。BinarySearch()使用二进制搜索算法在一维的排序数组中搜索指定元素。GetLowerBound()获取数组中指定

185、维度的下限。GetUpperBound()获取数组中指定维度的上限。C#从入门到实践从入门到实践10.3.3 10.3.3 获取数组长度获取数组长度数组长度是指数组元素的总数,即数组每一维度元素数量数组长度是指数组元素的总数,即数组每一维度元素数量之乘积。获取数组长度的方法存在多种,可以通过类的之乘积。获取数组长度的方法存在多种,可以通过类的属性获取,也可以通过属性获取,也可以通过Array类的方法获取。类的方法获取。1通过属性获取数组的长度通过属性获取数组的长度2通过方法获取数组的长度通过方法获取数组的长度C#从入门到实践从入门到实践10.3.4 10.3.4 获取元素的值获取元素的值获取数

186、组中指定元素的值最简单方法就是通过获取数组中指定元素的值最简单方法就是通过“运算运算符。符。C#从入门到实践从入门到实践10.3.5 10.3.5 设置元素的值设置元素的值和获取指定元素的值一样,也存在两种方法设置元素的值。和获取指定元素的值一样,也存在两种方法设置元素的值。第一种方法就是直接通过数组名和第一种方法就是直接通过数组名和“运算符来设置运算符来设置元素的值。元素的值。C#从入门到实践从入门到实践10.3.6 10.3.6 获取元素的索引获取元素的索引类为一维数组提供了获取元素的索引的两个静态方法:类为一维数组提供了获取元素的索引的两个静态方法:IndexOf()和和LastInde

187、xOf()方法。方法。IndexOf()方法获取匹配的、第方法获取匹配的、第一个元素的索引。一个元素的索引。LastIndexOf()方法获取匹配的、最后方法获取匹配的、最后一个元素的索引。一个元素的索引。C#从入门到实践从入门到实践10.3.7 10.3.7 排序数组排序数组类为一维数组提供了一个名称为类为一维数组提供了一个名称为“Sort()的方法,该方的方法,该方法可以对一维数组中的元素进行排序。能够使用法可以对一维数组中的元素进行排序。能够使用Sort()方法排序的数组中的元素必须实现方法排序的数组中的元素必须实现IComparable接口,接口,即数组中的元素是能够进行比较的,否那么

188、不能对该数即数组中的元素是能够进行比较的,否那么不能对该数组中的元素进行排序。组中的元素进行排序。C#从入门到实践从入门到实践10.3.8 10.3.8 反转数组反转数组类为一维数组提供了一个名称为类为一维数组提供了一个名称为“Reverse()的方法,该的方法,该方法可以反转一维数组中的全部元素或局部连续的元素。方法可以反转一维数组中的全部元素或局部连续的元素。C#从入门到实践从入门到实践10.4 10.4 动态数组动态数组System.ArrayListSystem.ArrayList动态数组又称为可变数组,且数组的长度可以动态修改。动态数组又称为可变数组,且数组的长度可以动态修改。动态数

189、组由动态数组由System.ArrayList类实现,它在保存元素时,类实现,它在保存元素时,仅仅保存元素的引用,而不是元素的具体值。因此,动仅仅保存元素的引用,而不是元素的具体值。因此,动态数组元素的数据类型可以是任何类型,而且各个元素态数组元素的数据类型可以是任何类型,而且各个元素的数据类型也可以不相同。的数据类型也可以不相同。C#从入门到实践从入门到实践10.4.1 10.4.1 属性属性System.ArrayList类包含了类包含了7个属性,如获取数组元素数量的个属性,如获取数组元素数量的Count属性、指示数组是否为只读的属性、指示数组是否为只读的ReadOnly属性等,如表所示。

190、属性等,如表所示。属性描述Capacity数组的容量。Count数组元素的数量。Item指定索引处的元素。IsFixedSize表示数组的大小是否固定。IsReadOnly表示数组是否为只读。IsSynchronized表示是否同步访问数组。SyncRoot获取同步访问数组的对象。C#从入门到实践从入门到实践10.4.2 10.4.2 方法方法System.ArrayList类包含了多个方法,如添加新元素到数组类包含了多个方法,如添加新元素到数组末尾中的末尾中的Add()方法、从数组中删除指定元素的方法、从数组中删除指定元素的Remove()方法等。方法等。C#从入门到实践从入门到实践10.4

191、.3 10.4.3 添加元素添加元素向动态数组添加一个新的元素可以使用向动态数组添加一个新的元素可以使用Add()方法或者方法或者Insert()方法。方法。Add()方法可以将新的元素添加到数组的末尾处,方法可以将新的元素添加到数组的末尾处,Insert()方法可以将新的元素添加到数组的指定位置。如果希方法可以将新的元素添加到数组的指定位置。如果希望把新的元素插入到数组元素数量大于望把新的元素插入到数组元素数量大于0的开始处,的开始处,那么只能使用那么只能使用Insert()方法。方法。C#从入门到实践从入门到实践10.4.4 10.4.4 移除元素移除元素如果要从动态数组中移除元素,那么可

192、以使用如果要从动态数组中移除元素,那么可以使用Remove()、RemoveAt()或或RemoveRange()方法。方法。Remove()方法从数组中移除方法从数组中移除指定的元素,指定的元素,RemoveAt()方法从数组中移除指定位置处方法从数组中移除指定位置处的元素,的元素,RemoveRange()方法从数组中移除指定范围内方法从数组中移除指定范围内的元素。的元素。C#从入门到实践从入门到实践10.5 10.5 实例一:抽签程序实例一:抽签程序【实例【实例10-1】使用整型数组实现抽签功能。该功能由】使用整型数组实现抽签功能。该功能由Draw(int count)函数实现,函数实现

193、,count参数表示签号的总数量。参数表示签号的总数量。C#从入门到实践从入门到实践10.6 10.6 小结小结本章主要介绍了本章主要介绍了C#语言中的数组,如数组概述、数组分类、语言中的数组,如数组概述、数组分类、静态数组、动态数组、抽签程序等。其中,读者要着重静态数组、动态数组、抽签程序等。其中,读者要着重掌握数组分类、一维数组、静态数组和动态数组,以及掌握数组分类、一维数组、静态数组和动态数组,以及使用数组编程的方法,为后续编写使用数组编程的方法,为后续编写C#程序代码奠定根底。程序代码奠定根底。下一章将要介绍下一章将要介绍C#语言中的接口。语言中的接口。C#从入门到实践从入门到实践10

194、.7 10.7 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_10的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“UsingArray的类,并在该类中定义的类,并在该类中定义如下成员,并使用这些成员测试如下成员,并使用这些成员测试Array类的各个方法的用途。类的各个方法的用途。名称为名称为“values1的、元素类型为的、元素类型为int的一维数组;的一维数组;名称为名称为“values2的

195、、元素类型为的、元素类型为string的一维数组;的一维数组;名称为名称为“values3的、元素类型为的、元素类型为int的二维数组;的二维数组;名称为名称为“values4的、元素类型为的、元素类型为string的一维数组;的一维数组;名称为名称为“values5的、元素类型为的、元素类型为int的三维数组;的三维数组;名称为名称为“values6的、元素类型为的、元素类型为int的交错数组。的交错数组。C#从入门到实践从入门到实践第第1111章章 接口接口接口和类一样,也是属于引用类型。接口可以用来描述属接口和类一样,也是属于引用类型。接口可以用来描述属于类或结构的一组相关功能,即定义一

196、种协议。类或结于类或结构的一组相关功能,即定义一种协议。类或结构可以实现接口,同时必须遵循它们所实现接口定义的构可以实现接口,同时必须遵循它们所实现接口定义的协议。本章将讲解协议。本章将讲解C#语言中的接口,主要介绍以下知识语言中的接口,主要介绍以下知识点。点。l接口概述;接口概述;l接口成员;接口成员;l实现接口;实现接口;l抽象类和接口。抽象类和接口。C#从入门到实践从入门到实践11.1 11.1 接口概述接口概述接口接口interface定义一种协议,实现该接口的类或结构定义一种协议,实现该接口的类或结构必须遵循该协议。一个接口可以继承于一个或多个其他必须遵循该协议。一个接口可以继承于一

197、个或多个其他接口,一个类或结构也可以实现一个或多个接口。接口接口,一个类或结构也可以实现一个或多个接口。接口可以包含可以包含4种成员:方法、属性、事件和索引器。接口种成员:方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,它仅仅指定实现该本身不提供它所定义的成员的实现,它仅仅指定实现该接口的类或结构必须提供的成员。接口的类或结构必须提供的成员。C#从入门到实践从入门到实践11.1.1 11.1.1 接口声明接口声明声明接口需要使用声明接口需要使用interface关键字,语法如下。关键字,语法如下。interface-modifiers interface identifier i

198、nterface-base interface-body ;interface-modifiers表示接口修饰符可选,表示接口修饰符可选,identifier表表示接口的名称,示接口的名称,interface-base表示接口的基接口可选表示接口的基接口可选,interface-body表示接口体,表示接口体,;分号是可选的。分号是可选的。4C#从入门到实践从入门到实践11.1.2 11.1.2 接口修饰符接口修饰符接口修饰符一般位于接口声明中的接口修饰符一般位于接口声明中的interface关键字之前,关键字之前,共包括共包括5个修饰符:个修饰符:new、public、protected、i

199、nternal和和private。其中,。其中,public、protected、internal和和private修修饰符控制接口的可访问性。它们的意义具体说明如下。饰符控制接口的可访问性。它们的意义具体说明如下。lpublic修饰符,表示该接口是公开的,访问不受限制。修饰符,表示该接口是公开的,访问不受限制。lprotected修饰符,表示该接口只能是本身或其派生的接修饰符,表示该接口只能是本身或其派生的接口访问。口访问。linternal修饰符,表示该接口只能是在当前应用程序中访修饰符,表示该接口只能是在当前应用程序中访问。问。lprivate修饰符,表示该接口只能是本身访问。修饰符,表

200、示该接口只能是本身访问。C#从入门到实践从入门到实践11.1.3 11.1.3 接口继承接口继承接口可以继承于一个或多个其他接口,也可以不继承。被接口可以继承于一个或多个其他接口,也可以不继承。被继承的接口称为该接口的显式基接口。当一个接口具有继承的接口称为该接口的显式基接口。当一个接口具有一个或多个显式基接口时,在声明该接口时,接口标识一个或多个显式基接口时,在声明该接口时,接口标识符后就要紧跟一个冒号和一个由符后就要紧跟一个冒号和一个由,逗号分隔的基接逗号分隔的基接口标识符列表。口标识符列表。C#从入门到实践从入门到实践11.2 11.2 接口成员接口成员接口的成员必须是方法、属性、事件或

201、索引器,而不能包接口的成员必须是方法、属性、事件或索引器,而不能包括常量、字段、运算符、实例构造函数、析构函数或类括常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。一个接口可以不型,也不能包含任何种类的静态成员。一个接口可以不包括任何成员,也可以包括一个或多个成员。接口成员包括任何成员,也可以包括一个或多个成员。接口成员默认隐式地具有默认隐式地具有public访问属性,而且在声明接口成员访问属性,而且在声明接口成员时不能包含任何修饰符如时不能包含任何修饰符如abstract、public、protected、internal、private、virtual、ov

202、erride和和static,否那,否那么会发生编译时错误。么会发生编译时错误。注意:一个接口的成员包括两局部:由接口本身声明的成注意:一个接口的成员包括两局部:由接口本身声明的成员和其从基接口继承的成员。员和其从基接口继承的成员。C#从入门到实践从入门到实践11.2.1 11.2.1 属性属性在接口中声明属性时,只能声明该属性具有哪个访问器在接口中声明属性时,只能声明该属性具有哪个访问器如如get或或set访问器,而不能实现该访问器。接口属性的访问器,而不能实现该访问器。接口属性的访问器只用于说明该属性是只读的、只写的还是读写的,访问器只用于说明该属性是只读的、只写的还是读写的,访问器体必须

203、始终是一个访问器体必须始终是一个;分号。分号。C#从入门到实践从入门到实践11.2.2 11.2.2 索引器索引器接口索引器和接口属性比较相似。在接口中声明索引器时,接口索引器和接口属性比较相似。在接口中声明索引器时,只能声明该索引器具有哪个访问器如只能声明该索引器具有哪个访问器如get或或set访问器,访问器,而不能实现该访问器。接口索引器的访问器只用于说明而不能实现该访问器。接口索引器的访问器只用于说明该索引器是只读的、只写的还是读写的,访问器体必须该索引器是只读的、只写的还是读写的,访问器体必须始终是一个始终是一个;分号。分号。C#从入门到实践从入门到实践11.2.3 11.2.3 方法

204、方法在接口中声明方法时,只能声明该方法的签名,而且该方在接口中声明方法时,只能声明该方法的签名,而且该方法的方法体只能为法的方法体只能为;分号,而不能包括该方法的实分号,而不能包括该方法的实现代码。现代码。C#从入门到实践从入门到实践11.2.4 11.2.4 事件事件在接口中声明事件时,只能声明该事件的签名,而且事件在接口中声明事件时,只能声明该事件的签名,而且事件的名称之后必须接一个的名称之后必须接一个;分号。分号。C#从入门到实践从入门到实践11.3 11.3 实现接口实现接口类和结构都可以实现接口。如果某一个类或接口实现了一类和结构都可以实现接口。如果某一个类或接口实现了一个或多个接口

205、,那么在声明该类或结构时,将实现的接个或多个接口,那么在声明该类或结构时,将实现的接口的标识符包含在该类或结构的基类列表中。口的标识符包含在该类或结构的基类列表中。C#从入门到实践从入门到实践11.3.1 11.3.1 实现属性实现属性实现接口属性即添加该接口属性的实现代码,接口属性的实现接口属性即添加该接口属性的实现代码,接口属性的名称和实现该接口属性的名称相同。名称和实现该接口属性的名称相同。C#从入门到实践从入门到实践11.3.2 11.3.2 实现索引器实现索引器实现接口索引器即添加该接口索引器的实现代码。实现接口索引器即添加该接口索引器的实现代码。C#从入门到实践从入门到实践11.3

206、.3 11.3.3 实现方法实现方法实现接口方法即添加该接口方法的实现代码,接口方法的实现接口方法即添加该接口方法的实现代码,接口方法的名称和实现该接口方法的签名相同。名称和实现该接口方法的签名相同。C#从入门到实践从入门到实践11.3.4 11.3.4 实现事件实现事件实现接口事件即添加该接口事件的实现代码,接口事件的实现接口事件即添加该接口事件的实现代码,接口事件的名称和实现该接口事件的签名相同。名称和实现该接口事件的签名相同。C#从入门到实践从入门到实践11.4 11.4 抽象类和接口抽象类和接口抽象类使用抽象类使用abstract修饰符,它用于表示所修饰的类是不完修饰符,它用于表示所修

207、饰的类是不完整的,并且它只能用作基类。抽象类与非抽象类在以下整的,并且它只能用作基类。抽象类与非抽象类在以下3个方面的区别。个方面的区别。抽象类不能直接实例化。如果抽象类使用抽象类不能直接实例化。如果抽象类使用new运算符,那运算符,那么发生编译时错误。么发生编译时错误。允许但不要求抽象类包含抽象成员。允许但不要求抽象类包含抽象成员。抽象类不能被密封。抽象类不能被密封。当从抽象类派生非抽象类时,这些非抽象类必须实现所继当从抽象类派生非抽象类时,这些非抽象类必须实现所继承的所有抽象成员,即重写这些抽象成员。承的所有抽象成员,即重写这些抽象成员。C#从入门到实践从入门到实践11.5 11.5 实例

208、一:设计算术计算接口实例一:设计算术计算接口【实例【实例11-1】设计了用于算术计算的】设计了用于算术计算的ICompute接口。该接接口。该接口包括口包括4个方法,具体说明如下。个方法,具体说明如下。ldouble Add(double leftValue,double rightValue),计算两计算两个数的和。个数的和。ldouble Sub(double leftValue,double rightValue),计算两计算两个数的差。个数的差。ldouble Multiply(double leftValue,double rightValue),计计算两个数的积。算两个数的积。ld

209、ouble Div(double leftValue,double rightValue),计算两计算两个数的商。个数的商。C#从入门到实践从入门到实践11.6 11.6 小结小结本章主要介绍了本章主要介绍了C#语言中的接口,如接口概述、接口成员、语言中的接口,如接口概述、接口成员、实现接口,抽象类和接口区别等。其中,读者要着重掌实现接口,抽象类和接口区别等。其中,读者要着重掌握接口成员和实现接口的方法,为后续编写握接口成员和实现接口的方法,为后续编写C#程序代码程序代码奠定根底。下一章将要介绍奠定根底。下一章将要介绍C#语言中的委托和事件。语言中的委托和事件。C#从入门到实践从入门到实践11

210、.7 11.7 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_11的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“MyInterface的接口,并在该接的接口,并在该接口中定义属性、索引器、方法、事件等成员。口中定义属性、索引器、方法、事件等成员。C#从入门到实践从入门到实践第第1212章章 委托和事件委托和事件委托是委托是C#语言中一种引用方法的类型,和语言中一种引用方法的类型,和C+中处理

211、函数指针的中处理函数指针的情况比较相似。不但可以向委托实例注册方法列表,而且还可情况比较相似。不但可以向委托实例注册方法列表,而且还可以通过委托实例来调用方法列表中的方法。事件是一种特殊的以通过委托实例来调用方法列表中的方法。事件是一种特殊的委托,它包含两个参数:指示事件源的委托,它包含两个参数:指示事件源的“对象源参数和封装对象源参数和封装事件的其他任何相关信息的事件的其他任何相关信息的“e参数。本章将讲解参数。本章将讲解C#语言中的语言中的委托和事件,主要介绍以下知识点。委托和事件,主要介绍以下知识点。声明委托;声明委托;委托实例化;委托实例化;委托调用;委托调用;声明事件;声明事件;注册

212、事件和移除事件;注册事件和移除事件;调用事件。调用事件。C#从入门到实践从入门到实践12.1 12.1 委托委托熟悉熟悉C+中函数指针的读者可能比较容易理解委托。委托中函数指针的读者可能比较容易理解委托。委托delegate是一种数据结构,它是用来处理类似于是一种数据结构,它是用来处理类似于C+中函数指针的情况,即委托能够引用静态方法或引用类中函数指针的情况,即委托能够引用静态方法或引用类实例及其实例方法。特别地,委托是完全面向对象的,实例及其实例方法。特别地,委托是完全面向对象的,同时也封装了对象实例和方法。同时也封装了对象实例和方法。所有委托类型的基类是类。类本身不是委托类型,而且不所有委

213、托类型的基类是类。类本身不是委托类型,而且不允许显式地直接从该来派生新的类型。委托实例封装了允许显式地直接从该来派生新的类型。委托实例封装了一个调用列表,该列表包含了一个或多个方法,每个方一个调用列表,该列表包含了一个或多个方法,每个方法称为一个可调用实体。法称为一个可调用实体。C#从入门到实践从入门到实践12.1.1 12.1.1 委托声明委托声明委托类型的声明将创立一个协定,该协定指定一个或多个方法的委托类型的声明将创立一个协定,该协定指定一个或多个方法的签名。委托是委托类型的实例,它可以引用静态方法或者实签名。委托是委托类型的实例,它可以引用静态方法或者实例方法。声明委托需要使用例方法。

214、声明委托需要使用delegate关键字,语法如下。关键字,语法如下。delegate-modifiers delegate return-type identifierdelegate-modifiers表示委托的修饰符可选,它包括表示委托的修饰符可选,它包括new、public、protected、internal和和private共共5个关键字。其中,个关键字。其中,public、protected、internal和和private修饰符控制委托的可访修饰符控制委托的可访问性。它们的意义具体说明如下。问性。它们的意义具体说明如下。public修饰符,表示该委托是公开的,访问不受限制。修饰

215、符,表示该委托是公开的,访问不受限制。protected修饰符,表示该委托只能是本身委托访问。修饰符,表示该委托只能是本身委托访问。internal修饰符,表示该委托只能是在当前应用程序中访问。修饰符,表示该委托只能是在当前应用程序中访问。private修饰符,表示该委托只能是本身访问。修饰符,表示该委托只能是本身访问。C#从入门到实践从入门到实践12.1.2 12.1.2 创立向委托注册方法创立向委托注册方法一旦声明一个委托之后,那么就指定了该委托方法列表中一旦声明一个委托之后,那么就指定了该委托方法列表中的方法签名,包括方法列表中的方法的返回类型和方法的方法签名,包括方法列表中的方法的返回

216、类型和方法参数。如果一个方法能够注册到某一个委托中,那个该参数。如果一个方法能够注册到某一个委托中,那个该方法的签名必须与该委托的所指定的签名完全匹配。匹方法的签名必须与该委托的所指定的签名完全匹配。匹配规那么如下。配规那么如下。方法的返回类型必须和委托的返回类型相同。方法的返回类型必须和委托的返回类型相同。方法的方法参数必须和委托的方法参数相同,参数的具体方法的方法参数必须和委托的方法参数相同,参数的具体名称可以不相同。名称可以不相同。C#从入门到实践从入门到实践12.1.3 12.1.3 委托实例化委托实例化委托实例化可以创立委托类型的实例,并向该实例注册方委托实例化可以创立委托类型的实例

217、,并向该实例注册方法列表。委托类型的实例的方法列表可以为静态方法、法列表。委托类型的实例的方法列表可以为静态方法、实例方法或者另外一个委托实例。实例方法或者另外一个委托实例。注意:委托实例化,它把静态方法、实例方法或者另外一注意:委托实例化,它把静态方法、实例方法或者另外一个委托的名称作为该实例的方法参数进行传递。个委托的名称作为该实例的方法参数进行传递。C#从入门到实践从入门到实践12.1.4 12.1.4 委托的方法列表委托的方法列表一个委托实例都必须包含其方法列表,方法列表可以包含一个委托实例都必须包含其方法列表,方法列表可以包含一个或多个方法。委托实例除了在其实例化时注册方法一个或多个

218、方法。委托实例除了在其实例化时注册方法之外,还可以通过之外,还可以通过“+或或“+=运算符向该实例的方运算符向该实例的方法列表中的注册方法,通过法列表中的注册方法,通过“-或或“-=运算符向该运算符向该实例的方法列表中的移除方法实例的方法列表中的移除方法C#从入门到实践从入门到实践12.1.5 12.1.5 委托调用委托调用一个委托实例的方法列表,又称为该委托实例的调用列表。一个委托实例的方法列表,又称为该委托实例的调用列表。一个调用列表可能包含一个或多个方法。如果一个调用一个调用列表可能包含一个或多个方法。如果一个调用列表包含多个方法时,当该委托实例被调用时,它将按列表包含多个方法时,当该委

219、托实例被调用时,它将按照调用列表中方法的注册顺序依次调用每一个方法。照调用列表中方法的注册顺序依次调用每一个方法。C#从入门到实践从入门到实践12.2 12.2 事件事件事件事件event是一种使对象或类能够提供通知的成员。客是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为相应的事件添加可执户端可以通过提供事件处理程序为相应的事件添加可执行代码。客户端可以实现为事件定义一些操作或方法,行代码。客户端可以实现为事件定义一些操作或方法,当事件发生时,将调用该事件事先定义的操作或方法。当事件发生时,将调用该事件事先定义的操作或方法。C#从入门到实践从入门到实践12.2.1 12.

220、2.1 声明事件声明事件事件其实是一种特殊类型的委托,它包含两个参数:指示事件其实是一种特殊类型的委托,它包含两个参数:指示事件源的事件源的“对象源参数和封装事件的其他任何相关信对象源参数和封装事件的其他任何相关信息的息的“e参数。其中,参数。其中,“e参数的类型为参数的类型为System.EventArgs类型或从类型或从System.EventArgs类派生的类派生的类型。声明事件一般包括以下两个步骤。类型。声明事件一般包括以下两个步骤。1声明事件的委托。声明事件的委托。2声明事件本身。声明事件本身。C#从入门到实践从入门到实践12.2.2 12.2.2 注册事件注册事件一个事件一旦声明之

221、后,该事件的默认值为一个事件一旦声明之后,该事件的默认值为null。如果希望。如果希望该事件执行事先指定的操作,那么首先向该事件注册方该事件执行事先指定的操作,那么首先向该事件注册方法列表即委托的调用列表。注册事件可以使用法列表即委托的调用列表。注册事件可以使用“+=运算符。运算符。C#从入门到实践从入门到实践12.2.3 12.2.3 移除事件移除事件除了注册事件之外,还可以移除事件。移除事件使用除了注册事件之外,还可以移除事件。移除事件使用“-=运算符。运算符。C#从入门到实践从入门到实践12.2.4 12.2.4 调用事件调用事件声明一个事件之后,如果没有向该事件注册方法,那么该声明一个

222、事件之后,如果没有向该事件注册方法,那么该事件的值为空事件的值为空null。因此,在调用事件时,往往需。因此,在调用事件时,往往需要检查该事件是否为空。要检查该事件是否为空。C#从入门到实践从入门到实践12.3 12.3 实例一:测试打印事件实例一:测试打印事件【实例【实例12-1】演示了测试打印事件的方法。该功能由】演示了测试打印事件的方法。该功能由TestPrintEvent类和类和PrintEventHandler委托实现。委托实现。C#从入门到实践从入门到实践12.4 12.4 小结小结本章主要介绍了本章主要介绍了C#语言中的委托和事件,如声明委托、委语言中的委托和事件,如声明委托、委

223、托实例化、委托调用、声明事件、注册事件、移除事件、托实例化、委托调用、声明事件、注册事件、移除事件、调用事件等。其中,读者要着重掌握声明委托、委托调调用事件等。其中,读者要着重掌握声明委托、委托调用、声明事件、注册事件和调用事件,为后续编写用、声明事件、注册事件和调用事件,为后续编写C#程程序代码奠定根底。下一章将要介绍序代码奠定根底。下一章将要介绍C#语言中的异常处理。语言中的异常处理。C#从入门到实践从入门到实践12.5 12.5 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_12的控制台应用程序,并实现以下功能。的控制台应用程

224、序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“PrintEventHandler的委托,并的委托,并使用该委托定义名称为使用该委托定义名称为“PrintEvent的事件,然后测的事件,然后测试该事件的使用方法。试该事件的使用方法。C#从入门到实践从入门到实践第第1313章章 异常处理异常处理异常是程序执行时遇到的任何错误情况或意外行为。应用异常是程序执行时遇到的任何错误情况或意外行为。应用程序必须能够统一处理在执行期间发生的错误。程序必须能够统一处理在执行期间发生的错误。.NET Framework

225、公共语言运行库提供了一个模型,以统一的公共语言运行库提供了一个模型,以统一的方式通知程序发生的错误。本章将讲解方式通知程序发生的错误。本章将讲解C#语言中的异常语言中的异常处理机制,主要介绍以下知识点。处理机制,主要介绍以下知识点。异常概述;异常概述;try语句;语句;类;类;.NET Framework常用异常类;常用异常类;创立自定义异常类。创立自定义异常类。C#从入门到实践从入门到实践13.1 13.1 异常概述异常概述和和C+程序语言一样,程序语言一样,C#程序语言也存在异常处理机制。程序语言也存在异常处理机制。C#程序语言中的异常用于处理系统级和应用程序级的错程序语言中的异常用于处理

226、系统级和应用程序级的错误状态,它是一种结构化的、统一的和类型平安的处理误状态,它是一种结构化的、统一的和类型平安的处理机制。机制。C#从入门到实践从入门到实践13.1.1 13.1.1 导致异常的原因导致异常的原因在应用程序运行时,发生异常的原因是多种多样的,如除在应用程序运行时,发生异常的原因是多种多样的,如除数为数为0、堆栈溢出等。导致异常的原因可以归纳为以下、堆栈溢出等。导致异常的原因可以归纳为以下2大类。大类。在执行语句和表达式在执行语句和表达式C#语言的过程中,有时会出现一语言的过程中,有时会出现一些例外情况,从而使得某些操作无法正常完成,此时就些例外情况,从而使得某些操作无法正常完

227、成,此时就会引发一个异常。会引发一个异常。应用程序使用应用程序使用throw语句特意产生一个异常,此时将引发一语句特意产生一个异常,此时将引发一个异常。个异常。C#从入门到实践从入门到实践13.1.2 try13.1.2 try语句语句try语句可以用来捕捉在代码块的执行期间发生的各种异常。语句可以用来捕捉在代码块的执行期间发生的各种异常。它可以包含它可以包含try块、块、catch块和块和finally块,具体说明如下。块,具体说明如下。ltry块,一般包含有可能发生异常的代码。块,一般包含有可能发生异常的代码。lcatch块,包含出现异常时需要执行的响应代码。块,包含出现异常时需要执行的响

228、应代码。lfinally块,包含出现异常时一定执行的代码,如资源清块,包含出现异常时一定执行的代码,如资源清理等操作。理等操作。C#从入门到实践从入门到实践13.1.3 13.1.3 异常处理异常处理异常是由异常是由try语句处理的。当发生异常时,系统将搜索与当语句处理的。当发生异常时,系统将搜索与当前前try块相关的最近的、可以处理该异常的块相关的最近的、可以处理该异常的catch块,然块,然后由该后由该catch块处理该异常。如果与当前块处理该异常。如果与当前try块相关的所块相关的所有有catch块都不能处理该异常,那么沿着堆栈向上搜索封块都不能处理该异常,那么沿着堆栈向上搜索封闭该异常

229、代码的闭该异常代码的try块及其相关联的块及其相关联的catch块,如果找到,块,如果找到,那么由该那么由该catch块处理该异常。如果还没有找到块处理该异常。如果还没有找到catch块,块,那么重复上述过程,直到找到那么重复上述过程,直到找到catch块。如果到达调用堆块。如果到达调用堆栈顶部仍然没有找到处理该异常的栈顶部仍然没有找到处理该异常的catch块,那么由默认块,那么由默认的异常处理程序处理该异常,然后应用程序终止。的异常处理程序处理该异常,然后应用程序终止。C#从入门到实践从入门到实践类类类表示在应用程序执行期间发生的错误,它是类表示在应用程序执行期间发生的错误,它是.NET F

230、ramework中所有异常的基类型。当系统或应用程序发生错中所有异常的基类型。当系统或应用程序发生错误时,将通过引发包含错误信息的异常来报告错误。一旦异误时,将通过引发包含错误信息的异常来报告错误。一旦异常发生后,将由该应用程序或默认异常处理程序如类来常发生后,将由该应用程序或默认异常处理程序如类来处理异常。处理异常。类包含描述错误的可读文本。当异常发生时,应用程序的运行类包含描述错误的可读文本。当异常发生时,应用程序的运行库如库如.NET Framework将产生消息保存在将产生消息保存在Exception类类的实例的的实例的Message属性中通知用户错误的性质并提供解决属性中通知用户错误

231、的性质并提供解决该问题的操作建议。该问题的操作建议。Exception类包括以下两类异常。类包括以下两类异常。从从SystemException派生的预定义公共语言运行库异常类。派生的预定义公共语言运行库异常类。从从ApplicationException派生的用户定义的应用程序异常类。派生的用户定义的应用程序异常类。C#从入门到实践从入门到实践13.3 13.3 常用异常类常用异常类.NET Framework提供了提供了10个常用异常类,如处理空个常用异常类,如处理空null引用的引用的System.NullReferenceException类、处理数组索引小于类、处理数组索引小于0或超

232、过其下或超过其下标的标的System.IndexOutOfRangeException类等。这些常用异常类及其类等。这些常用异常类及其说明如表所示。说明如表所示。类描述System.NullReferenceException如果使用null引用,引发此异常。System.IndexOutOfRangeException如果使用小于零或超出数组界限的下标访问数组时,引发该异常。System.InvalidCastException如果显式转换失败时,就会引发此异常。System.DivideByZeroException当除数为0时,引发该异常。System.StackOverflowExce

233、ption当堆栈溢出(如无限递归)时,引发该异常。System.OverflowException在checked上下文中的算术运算溢出时,引发该异常。System.OutOfMemoryException在通过new操作分配内存失败时,引发该异常。System.ArithmeticException在算术运算期间发生错误时,引发该异常。System.TypeInitializationException静态构造函数引发异常,且没有可以捕捉到它的catch子句时,引发该异常。System.ArrayTypeMismatchException如果被存储的元素的实际类型与数组的元素类型不兼容时,引

234、发此异常。C#从入门到实践从入门到实践13.4 13.4 实例一:自定义异常处理类实例一:自定义异常处理类本实例创立了一个自定义异常处理类,它的名称为本实例创立了一个自定义异常处理类,它的名称为CustomException,并直接继承于类。,并直接继承于类。CustomException类声明了一个名称为类声明了一个名称为ErrorCode的属性,表示错误代码。的属性,表示错误代码。因此,使用因此,使用CustomException类处理异常,可以为异常类处理异常,可以为异常添加错误代码。添加错误代码。C#从入门到实践从入门到实践13.4.1 13.4.1 设计设计CustomExcepti

235、onCustomException类类CustomException类包含类包含1个字段:个字段:errorCode,表示错误代,表示错误代码,类型为码,类型为int。程序代码如下。程序代码如下。public class CustomExceptionprivate int errorCode = 10001;C#从入门到实践从入门到实践13.4.2 13.4.2 使用使用CustomExceptionCustomException类处理异常类处理异常【实例【实例13-1】使用】使用CustomException类处理异常,并介绍了类处理异常,并介绍了使用使用CustomException类产

236、生异常并捕获该类产生异常类产生异常并捕获该类产生异常的方法。的方法。C#从入门到实践从入门到实践13.5 13.5 小结小结本章主要介绍了本章主要介绍了C#语言中的异常,如异常概述、语言中的异常,如异常概述、try语句、语句、类、类、.NET Framework常用异常类、自定义异常类等。其常用异常类、自定义异常类等。其中,读者要着重掌握中,读者要着重掌握try语句,以及处理异常的方法,为语句,以及处理异常的方法,为后续编写后续编写C#程序代码奠定根底。下一章将要介绍程序代码奠定根底。下一章将要介绍C#语言语言中的泛型。中的泛型。C#从入门到实践从入门到实践13.6 习题习题在在Visual

237、Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_13的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“MyException的类继承于的类继承于Exception,并使用该类处理自定义的异常。,并使用该类处理自定义的异常。C#从入门到实践从入门到实践第第1414章章 泛型泛型泛型泛型Generic是具有占位符类型参数的类、结构、是具有占位符类型参数的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存接口和方法,这些

238、占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。泛型参数作为其字段的类型和其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其形参方法可以将其类型参数用作其返回值的类型或者其形参的类型之一。本章将讲解的类型之一。本章将讲解C#语言中的泛型,主要介绍以语言中的泛型,主要介绍以下知识点下知识点 。泛型概述;泛型概述;泛型方法;泛型方法;创立泛型列表创立泛型列表创立

239、泛型堆栈。创立泛型堆栈。C#从入门到实践从入门到实践14.1 14.1 泛型概述泛型概述使用过使用过C+模板的读者可能熟悉泛型模板的读者可能熟悉泛型Generic这一概念。这一概念。C#中的泛型能够将类型作为参数来传递,即在创立类型中的泛型能够将类型作为参数来传递,即在创立类型时,事先使用一个特定的符号如时,事先使用一个特定的符号如T等代替实际的类等代替实际的类型,在创立该类型的实例时,才指定型,在创立该类型的实例时,才指定T的实际类型。的实际类型。泛型可以让类、结构、接口、委托和方法按它们存储和操泛型可以让类、结构、接口、委托和方法按它们存储和操作的数据的类型进行参数化。泛型能提供更强的编译

240、时作的数据的类型进行参数化。泛型能提供更强的编译时类型检查,减少数据类型之间的显式转换,以及装箱操类型检查,减少数据类型之间的显式转换,以及装箱操作和运行时的类型检查。作和运行时的类型检查。使用泛型类型可以最大限度地重用代码、保护类型的平安使用泛型类型可以最大限度地重用代码、保护类型的平安以及提高性能。泛型最常见的用途是创立集合类。以及提高性能。泛型最常见的用途是创立集合类。.NET Framework类库在命名空间中包含多个新的泛型集合类,类库在命名空间中包含多个新的泛型集合类,如如List、Stack、Queue等。当然,开发人员等。当然,开发人员也可以创立自定义泛型类型。也可以创立自定义

241、泛型类型。C#从入门到实践从入门到实践14.1.1 14.1.1 泛型类声明泛型类声明泛型类声明也是一种类的声明,因此,泛型类声明也遵循泛型类声明也是一种类的声明,因此,泛型类声明也遵循类声明的规那么。一个泛型类一般至少包含一个类型形类声明的规那么。一个泛型类一般至少包含一个类型形参小节中介绍。当创立该泛型类的实例时,需要指参小节中介绍。当创立该泛型类的实例时,需要指定该类型形参的具体类型。定该类型形参的具体类型。C#从入门到实践从入门到实践14.1.2 14.1.2 类型形参类型形参类型形参放置在类名后,并在类型形参放置在类名后,并在“分隔符中指定。分隔符中指定。类型形参仅仅是一个简单标识符

242、,是将来提供的类型的类型形参仅仅是一个简单标识符,是将来提供的类型的形式占位符。换句话说,形式占位符。换句话说,T类型形参只起占位符的作用,类型形参只起占位符的作用,直到在使用时才为其指定了实际类型。直到在使用时才为其指定了实际类型。每一个类型形参所代表的实际类型由其所在实例创立时指每一个类型形参所代表的实际类型由其所在实例创立时指定。特别地,该实例将存储类型形参的数据而不进行数定。特别地,该实例将存储类型形参的数据而不进行数据类型转换。据类型转换。C#从入门到实践从入门到实践14.1.3 14.1.3 类型形参的约束类型形参的约束通常地,类型形参的类型可以指定为任何类型。然而,一通常地,类型

243、形参的类型可以指定为任何类型。然而,一些类型形参需要指定一定种类的类型,如结构、类等。些类型形参需要指定一定种类的类型,如结构、类等。为了实现该功能,就需要限制类型形参的类型,这种限为了实现该功能,就需要限制类型形参的类型,这种限制被称为约束。即在定义泛型类时,可以限制在实例化制被称为约束。即在定义泛型类时,可以限制在实例化类时用于类型参数的类型种类。如果尝试使用某个约束类时用于类型参数的类型种类。如果尝试使用某个约束所不允许的类型来实例化类,那么会产生编译时错误。所不允许的类型来实例化类,那么会产生编译时错误。 C#从入门到实践从入门到实践14.1.4 14.1.4 泛型类的成员泛型类的成员

244、泛型类的所有成员都可以直接使用其所属类的类型形参。泛型类的所有成员都可以直接使用其所属类的类型形参。在运行时,类型形参都被替换为相应的实际类型该类在运行时,类型形参都被替换为相应的实际类型该类型在创立类的实例时指定。型在创立类的实例时指定。C#从入门到实践从入门到实践14.1.5 14.1.5 泛型类的静态字段泛型类的静态字段在泛型类中,静态字段的共享方法比较特殊,即只有在具在泛型类中,静态字段的共享方法比较特殊,即只有在具有相同类型形参的类型的实例才能够共享同一个静态字有相同类型形参的类型的实例才能够共享同一个静态字段的值。段的值。C#从入门到实践从入门到实践14.2 14.2 泛型方法泛型

245、方法泛型方法泛型方法Generic Method是使用类型参数声明的方法,是使用类型参数声明的方法,它可以声明在类、结构或接口中,而这些类、结构或接它可以声明在类、结构或接口中,而这些类、结构或接口本身可以是泛型或非泛型的。如果这些类、结构或接口本身可以是泛型或非泛型的。如果这些类、结构或接口也是泛型类型时,那么在这些方法内既可以引用该泛口也是泛型类型时,那么在这些方法内既可以引用该泛型方法的类型形参,也可以使用这些类、结构或接口的型方法的类型形参,也可以使用这些类、结构或接口的类型形参。类型形参。C#从入门到实践从入门到实践14.2.1 14.2.1 声明泛型方法声明泛型方法和普通方法相比,

246、除了普通的参数之外,泛型方法还必须和普通方法相比,除了普通的参数之外,泛型方法还必须包含类型形参,即泛型方法是指在声明中包含类型形参包含类型形参,即泛型方法是指在声明中包含类型形参的方法。的方法。C#从入门到实践从入门到实践14.2.2 14.2.2 调用泛型方法调用泛型方法泛型方法调用可以显式指定类型实参列表,或者可以省略泛型方法调用可以显式指定类型实参列表,或者可以省略类型实参列表并依赖类型推断确定类型实参。通常地,类型实参列表并依赖类型推断确定类型实参。通常地,调用泛型方法和调用普通方法一样,但需要为类型形参调用泛型方法和调用普通方法一样,但需要为类型形参提供相应的类型实参列表。提供相应

247、的类型实参列表。C#从入门到实践从入门到实践14.2.3 14.2.3 通过委托调用泛型方法通过委托调用泛型方法除了中调用泛型方法的方法之外,还可以通过委托来调用除了中调用泛型方法的方法之外,还可以通过委托来调用泛型方法。泛型方法。C#从入门到实践从入门到实践14.2.4 14.2.4 虚泛型方法虚泛型方法和普通方法一样,泛型方法也存在虚泛型方法,它也可以和普通方法一样,泛型方法也存在虚泛型方法,它也可以使用使用abstract、virtual和和override修饰符进行声明。修饰符进行声明。C#从入门到实践从入门到实践14.3 14.3 实例一:实现泛型列表实例一:实现泛型列表本实例首先创

248、立了名称为本实例首先创立了名称为“GenericList的泛型类的泛型类保存在保存在GenericList.cs文件中,并为该类提供文件中,并为该类提供5个方法:个方法:Add(T item)、Remove(T item)、RemoveAt(int index)、Clear()和和Sort(IComparer c);然后创立该类的实例;然后创立该类的实例list,并介绍了并介绍了GenericList类的属性和方法的使用方法。类的属性和方法的使用方法。C#从入门到实践从入门到实践14.3.1 14.3.1 设计泛型列表类设计泛型列表类GenericListGenericListGenericL

249、ist泛型类为泛型类为T类型形参添加了约束类型形参添加了约束“where T:IComparable,即约束,即约束T类型形参的类型必须实现类型形参的类型必须实现IComparable接口。接口。GenericList泛型类包含泛型类包含list字段,字段,表示一个列表,类型为表示一个列表,类型为List。程序代码如下。程序代码如下。public class GenericList where T:IComparable/ 私有字段私有字段list,类型为,类型为List private List list;C#从入门到实践从入门到实践14.3.2 14.3.2 测试泛型列表测试泛型列表【实例

250、【实例14-1】测试】测试GenericList类,并创立了该类的实例类,并创立了该类的实例list。C#从入门到实践从入门到实践14.4 14.4 实例二:实现泛型堆栈实例二:实现泛型堆栈本实例首先创立了名称为本实例首先创立了名称为“GenericStack的泛型类的泛型类保存在保存在GenericStack.cs文件中,并为该类提供文件中,并为该类提供5个方法:个方法:IsEmpty()、Push(T item)、Pop()、Peek()和和Clear();然后创立该;然后创立该类的实例类的实例stack,并介绍了,并介绍了GenericStack类的属性和类的属性和方法的使用方法。方法的

251、使用方法。C#从入门到实践从入门到实践14.4.1 14.4.1 设计泛型堆栈类设计泛型堆栈类GenericStackGenericStackGenericStack泛型类为泛型类为T类型形参添加了约束类型形参添加了约束“where T:class,即约束,即约束T类型形参的类型必须为引用类型。类型形参的类型必须为引用类型。GenericStack泛型类包含泛型类包含stack字段,表示一个堆栈,字段,表示一个堆栈,类型为类型为Stack。C#从入门到实践从入门到实践14.4.2 14.4.2 测试泛型堆栈测试泛型堆栈【实例【实例14-2】测试】测试GenericStack类,并创立了该类的实

252、类,并创立了该类的实例例stack。C#从入门到实践从入门到实践14.5 14.5 小结小结本章主要介绍了本章主要介绍了C#语言中的泛型,如泛型概述、泛型方法、语言中的泛型,如泛型概述、泛型方法、泛型列表、泛型堆栈等。其中,读者要着重掌握泛型概泛型列表、泛型堆栈等。其中,读者要着重掌握泛型概述,以及创立泛型类如泛型列表、泛型堆栈等的方述,以及创立泛型类如泛型列表、泛型堆栈等的方法,为后续编写法,为后续编写C#程序代码奠定根底。下一章将要介绍程序代码奠定根底。下一章将要介绍C#语言中的分部类型和可空类型。语言中的分部类型和可空类型。C#从入门到实践从入门到实践14.6 14.6 习题习题在在Vi

253、sual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_14的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“MyGenericStack的泛型堆栈,同的泛型堆栈,同时实现堆栈的常用操作,如入栈、出栈、堆栈是否为空时实现堆栈的常用操作,如入栈、出栈、堆栈是否为空等。等。C#从入门到实践从入门到实践第第1515章章 分部类型和可空类型分部类型和可空类型分部类型可以将类、结构、接口或者方法的定义拆分为一分部类型可以将类、结构

254、、接口或者方法的定义拆分为一个或多个局部,甚至可以保存为多个源文件中。可空类个或多个局部,甚至可以保存为多个源文件中。可空类型可以用来处理值类型的值为空的情况,它能够指示可型可以用来处理值类型的值为空的情况,它能够指示可空类型的实例是否包含一个确定的值。本章将讲解空类型的实例是否包含一个确定的值。本章将讲解C#语语言中的分部类型和可空类型,主要介绍以下知识点。言中的分部类型和可空类型,主要介绍以下知识点。声明分部类、结构和接口;声明分部类、结构和接口;分部类型同名成员处理;分部类型同名成员处理;处理分部类型的基接口;处理分部类型的基接口;可空类型的属性;可空类型的属性;可空类型的方法;可空类型

255、的方法;bool?类型。类型。C#从入门到实践从入门到实践15.1 15.1 分部类型分部类型分部类型分部类型Partial type允许将类、结构和接口划分为多个局部,允许将类、结构和接口划分为多个局部,并存储在不同的源文件中,以便于开发和维护。在并存储在不同的源文件中,以便于开发和维护。在Visual Studio 2021集成开发环境中开发应用程序时,有时一个类集成开发环境中开发应用程序时,有时一个类如如Windows窗体、窗体页等的一局部代码由机器自动生成,窗体、窗体页等的一局部代码由机器自动生成,另外一局部代码由程序员编写。如果把这个类设置为分部类,另外一局部代码由程序员编写。如果把

256、这个类设置为分部类,那么这两局部代码可以保存在不同的源文件中,从而增加了那么这两局部代码可以保存在不同的源文件中,从而增加了应用程序的代码的灵活性。应用程序的代码的灵活性。在声明分部类型的每一个局部时,每一个局部都必须包含在声明分部类型的每一个局部时,每一个局部都必须包含partial修饰符,并且分部类型的所有声明代码都必须位于同一命名修饰符,并且分部类型的所有声明代码都必须位于同一命名空间中。空间中。partial修饰符表示它所在的类型可能还包含其他局部,修饰符表示它所在的类型可能还包含其他局部,但是其他局部并不一定是必须的。如果一个类型只包含一个但是其他局部并不一定是必须的。如果一个类型只

257、包含一个局部,在声明该类型时使用了局部,在声明该类型时使用了partial修饰符,也是正确的。修饰符,也是正确的。C#从入门到实践从入门到实践15.1.1 15.1.1 声明分部类声明分部类使用使用partial修饰符可以用来声明分部类。修饰符可以用来声明分部类。C#从入门到实践从入门到实践15.1.2 15.1.2 声明分部结构声明分部结构使用使用partial修饰符可以用来声明分部结构。修饰符可以用来声明分部结构。C#从入门到实践从入门到实践15.1.3 15.1.3 声明分部接口声明分部接口使用使用partial修饰符除了可以用来声明分部类和结构之外,修饰符除了可以用来声明分部类和结构之

258、外,还可以用来声明接口。还可以用来声明接口。C#从入门到实践从入门到实践15.1.4 15.1.4 同名成员处理同名成员处理如果一个分部类型包含了多个局部,那么该类型的所有成如果一个分部类型包含了多个局部,那么该类型的所有成员为各个局部成员的并集,并且在每一个局部中可以访员为各个局部成员的并集,并且在每一个局部中可以访问其他局部的成员,即使在声明该成员时使用了问其他局部的成员,即使在声明该成员时使用了private修饰符。然而,在不同局部中声明了同一个名称的成员,修饰符。然而,在不同局部中声明了同一个名称的成员,那么发生编译时错误。除非该成员使用了那么发生编译时错误。除非该成员使用了parti

259、al修饰符。修饰符。C#从入门到实践从入门到实践15.1.5 15.1.5 处理基接口处理基接口如果一个分部类型包含了多个局部,那么该类型的所有基如果一个分部类型包含了多个局部,那么该类型的所有基接口集是每一个局部指定的基接口的并集。一个基接口接口集是每一个局部指定的基接口的并集。一个基接口在分部类型的一个局部中只能指定一次,但是可以在多在分部类型的一个局部中只能指定一次,但是可以在多个局部中同时被指定,即多个局部可以同时指定同一个个局部中同时被指定,即多个局部可以同时指定同一个基接口。基接口。注意:在整个分部类型中,一个基接口的成员的实现只能注意:在整个分部类型中,一个基接口的成员的实现只能

260、是一个。但是,一个局部的基接口可以由另外一个局部是一个。但是,一个局部的基接口可以由另外一个局部提供该基接口的实现。提供该基接口的实现。C#从入门到实践从入门到实践15.2 15.2 可空类型可空类型可空类型可空类型Nullable是一个组合了根底类型的值和布尔空是一个组合了根底类型的值和布尔空值指示符的结构。可空类型除了表示根底类型的所有值值指示符的结构。可空类型除了表示根底类型的所有值之外,还可以表示空值之外,还可以表示空值null。可空类型为值类型,。可空类型为值类型,声明可空类型存在以下两种形式。声明可空类型存在以下两种形式。1使用使用System.Nullable类声明可空类型类声明

261、可空类型2使用使用?问号声明可空类型问号声明可空类型C#从入门到实践从入门到实践15.2.1 HasValue15.2.1 HasValue和和ValueValue属性属性任何可空类型的实例都包含两个公共只读属性:任何可空类型的实例都包含两个公共只读属性:HasValue和和Value。它们的具体意义说明如下。它们的具体意义说明如下。HasValue属性的类型为属性的类型为bool,它表示该实例是否包含一个,它表示该实例是否包含一个确定值。如果确定值。如果HasValue属性的值为属性的值为true,那么表示该实,那么表示该实例包含一个确定的值。否那么,表示该实例为空,即它例包含一个确定的值。

262、否那么,表示该实例为空,即它不包含确定的值。此时,如果要获取该实例的值,那么不包含确定的值。此时,如果要获取该实例的值,那么发生运行时错误。发生运行时错误。Value属性的类型为该可空类型的根底类型,它表示该实例属性的类型为该可空类型的根底类型,它表示该实例的一个确定的值,并作为该实例的值。的一个确定的值,并作为该实例的值。C#从入门到实践从入门到实践15.2.2 GetValueOrDefault()15.2.2 GetValueOrDefault()方法方法可空类型的实例只包含一个方法:可空类型的实例只包含一个方法:GetValueOrDefault(),它可以用来获取可空类型的实例的值或

263、默认值。它存在它可以用来获取可空类型的实例的值或默认值。它存在以下两种重载形式。以下两种重载形式。1public T GetValueOrDefault()2public T GetValueOrDefault(T defaultValue)T表示可空类型的根底类型。如果可空类型的实例的表示可空类型的根底类型。如果可空类型的实例的HasValue属性的值为属性的值为true,那么该方法返回该实例的值,那么该方法返回该实例的值即即Value属性的值。如果可空类型的实例的属性的值。如果可空类型的实例的HasValue属性的值为属性的值为false,1方法返回该实例的默认值,方法返回该实例的默认值,

264、2方法返回方法返回defaultValue参数的值。参数的值。C#从入门到实践从入门到实践15.2.3 bool?15.2.3 bool?类型类型bool?类型为可空布尔类型,它可以表示类型为可空布尔类型,它可以表示3个值:个值:true、false和和null。可空布尔类型提供了两个运算符:。可空布尔类型提供了两个运算符:&和和|。&运算符表示逻运算符表示逻辑与,辑与,|运算符表示逻辑或。可空布尔类型的实例运算结果如表运算符表示逻辑或。可空布尔类型的实例运算结果如表所示。所示。XYX&YX|Ytruetruetruetruetruefalsefalsetruetruenullnulltrue

265、falsetruefalsetruefalsefalsefalsefalsefalsenullfalsenullnulltruenulltruenullfalsefalsenullnullnullnullnullC#从入门到实践从入门到实践15.3 15.3 实例一:测试可空类型实例一:测试可空类型【实例【实例15-1】演示了测试基类型为】演示了测试基类型为int的可空类型的方法。的可空类型的方法。该功能由该功能由TestNullableType类实现。类实现。C#从入门到实践从入门到实践15.4 15.4 小结小结本章主要介绍了本章主要介绍了C#语言中的分部类型和可空类型,如声明语言中的分部

266、类型和可空类型,如声明分部类、结构和接口、分部类型同名成员处理、处理分分部类、结构和接口、分部类型同名成员处理、处理分部类型的基接口、可空类型的属性、可空类型的方法、部类型的基接口、可空类型的属性、可空类型的方法、bool?类型等。其中,读者要着重掌握数组声明分部类和类型等。其中,读者要着重掌握数组声明分部类和使用可空类型的方法,为后续编写使用可空类型的方法,为后续编写C#程序代码奠定根底。程序代码奠定根底。下一章将要介绍下一章将要介绍C#语言中的隐型变量、初始化器、匿名语言中的隐型变量、初始化器、匿名类型和隐型数组。类型和隐型数组。C#从入门到实践从入门到实践15.5 15.5 习题习题在在

267、Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_15的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2创立一个名称为创立一个名称为“UsingStringNull的类,并在该的类,并在该类处理可以为空的字符串。类处理可以为空的字符串。C#从入门到实践从入门到实践第第1616章章 隐型变量、初始化器、匿名类型和隐型数组隐型变量、初始化器、匿名类型和隐型数组隐型局部变量是使用隐型局部变量是使用var关键字声明的一种隐藏类型的局部关键字声明的一

268、种隐藏类型的局部变量。初始化器包括对象初始化器和集合初始化器,它变量。初始化器包括对象初始化器和集合初始化器,它们分别用来初始化对象和集合。使用们分别用来初始化对象和集合。使用new运算符和匿名运算符和匿名对象初始化器可以创立一个匿名类型的对象;使用对象初始化器可以创立一个匿名类型的对象;使用var关关键字和匿名数组初始化器可以创立一个隐型数组。本章键字和匿名数组初始化器可以创立一个隐型数组。本章将讲解将讲解C#语言中的隐型局部变量、对象初始化器、集合语言中的隐型局部变量、对象初始化器、集合初始化器、匿名类型和隐型数组,主要介绍以下知识点。初始化器、匿名类型和隐型数组,主要介绍以下知识点。声明

269、隐型局部变量;声明隐型局部变量;使用隐型局部变量;使用隐型局部变量;对象初始化器;对象初始化器;集合初始化器;集合初始化器;匿名类型;匿名类型;隐型数组。隐型数组。C#从入门到实践从入门到实践16.1 16.1 隐型局部变量隐型局部变量顾名思义,隐型顾名思义,隐型implicitly typed局部变量是一个局部变局部变量是一个局部变量,而且它的类型被隐藏了。在隐型局部变量声明中,量,而且它的类型被隐藏了。在隐型局部变量声明中,正被声明的局部变量的类型可以从初始化该变量的表达正被声明的局部变量的类型可以从初始化该变量的表达式推导出来。式推导出来。C#从入门到实践从入门到实践16.1.1 16.

270、1.1 声明隐型局部变量声明隐型局部变量声明隐型局部变量需要使用声明隐型局部变量需要使用var关键字,并使用关键字,并使用var关键字关键字作为变量的类型。在声明隐型局部变量时,不明确指定作为变量的类型。在声明隐型局部变量时,不明确指定该变量的类型,而是使用该变量的类型,而是使用var关键字指定变量的类型。该关键字指定变量的类型。该变量的实际类型将在其初始化表达式中推导出来。变量的实际类型将在其初始化表达式中推导出来。C#从入门到实践从入门到实践16.1.2 16.1.2 使用隐型局部变量使用隐型局部变量使用隐型局部变量可以不显式指定变量的类型,从而简化使用隐型局部变量可以不显式指定变量的类型

271、,从而简化了程序代码。然而,如果大量使用隐型局部变量,往往了程序代码。然而,如果大量使用隐型局部变量,往往可能造成程序代码难以理解和阅读。因此,只有在适当可能造成程序代码难以理解和阅读。因此,只有在适当的时候使用隐型局部变量,才是一个比较好的选择。隐的时候使用隐型局部变量,才是一个比较好的选择。隐型局部变量比较适合以下型局部变量比较适合以下4种场景。种场景。1声明隐型局部变量声明隐型局部变量2for语句中语句中3foreach语句中语句中4using语句中语句中C#从入门到实践从入门到实践16.2 16.2 对象初始化器对象初始化器对象初始化器对象初始化器object initializer又

272、称为对象初始值设定又称为对象初始值设定项,它可以为某个对象的零个或多个字段或属性指定值。项,它可以为某个对象的零个或多个字段或属性指定值。即对象初始化器不显式调用该对象类型的构造函数,就即对象初始化器不显式调用该对象类型的构造函数,就能够创立该对象类型的实例。能够创立该对象类型的实例。对象初始化器包含一组成员初始值设定项。这一组设定项对象初始化器包含一组成员初始值设定项。这一组设定项由由“和和“包围,各个设定项之间用包围,各个设定项之间用,逗号分逗号分隔。每一个成员初始值设定项都为一个赋值表达式,表隔。每一个成员初始值设定项都为一个赋值表达式,表达式的左边为成员的名称,表达式的右边是一个可计算

273、达式的左边为成员的名称,表达式的右边是一个可计算的表达式。的表达式。“ID = 1表达式就是一个成员初始值设定表达式就是一个成员初始值设定项,项,“ID = 1,Name = Zhangsan表达式就是一组表达式就是一组设定项。设定项。C#从入门到实践从入门到实践16.3 16.3 集合初始化器集合初始化器集合初始化器集合初始化器collection initializer又称为集合初始值设又称为集合初始值设定项,它可以用来设置集合中的元素。集合初始化器包定项,它可以用来设置集合中的元素。集合初始化器包含一组元素初始值设定项。这一组设定项由含一组元素初始值设定项。这一组设定项由“和和“包围,各

274、个设定项之间用包围,各个设定项之间用,逗号分隔。每一个元逗号分隔。每一个元素初始值设定项指定一个元素,素初始值设定项指定一个元素,“1,2,3,4,5,6,7,8,9表达式就是一组元素初始值表达式就是一组元素初始值设定项。设定项。C#从入门到实践从入门到实践16.4 16.4 匿名类型匿名类型顾名思义,匿名类型是一种隐藏了类型名称的类型,它由顾名思义,匿名类型是一种隐藏了类型名称的类型,它由new运算符和匿名对象初始化器共同实现。即使用运算符和匿名对象初始化器共同实现。即使用new运运算符和匿名对象初始化器可以创立一个新的对象,这个算符和匿名对象初始化器可以创立一个新的对象,这个新创立的对象就

275、是一个匿名类型的对象。其中,把新创立的对象就是一个匿名类型的对象。其中,把new运算符和匿名对象初始化器组成的表达式又称为匿名对运算符和匿名对象初始化器组成的表达式又称为匿名对象创立表达式。象创立表达式。C#从入门到实践从入门到实践16.5 16.5 隐型数组隐型数组隐型数组和匿名类型比较相似。和匿名类型的匿名对象初隐型数组和匿名类型比较相似。和匿名类型的匿名对象初始化器一样,匿名数组也存在一个匿名数组初始化器。始化器一样,匿名数组也存在一个匿名数组初始化器。匿名对象初始化器一般用于创立一个匿名类型的对象,匿名对象初始化器一般用于创立一个匿名类型的对象,匿名数组初始化器用来创立一个匿名数组。匿

276、名数组初始化器用来创立一个匿名数组。匿名数组由匿名数组由var关键字和匿名数组初始化器共同创立,而且关键字和匿名数组初始化器共同创立,而且匿名数组初始化器中的元素类型都必须能够隐式转换为匿名数组初始化器中的元素类型都必须能够隐式转换为同一个类型不能为同一个类型不能为null。即对于匿名数组初始化器。即对于匿名数组初始化器而言,会存在一种类型不能为而言,会存在一种类型不能为null,使得该匿名数,使得该匿名数组初始化器中所有元素都能够转换为该类型的元素。组初始化器中所有元素都能够转换为该类型的元素。C#从入门到实践从入门到实践16.6 16.6 实例一:在实例一:在foreachforeach语

277、句中使用隐型局语句中使用隐型局部变量部变量【实例【实例16-1】在】在foreach语句中使用隐型局部变量遍历元素类语句中使用隐型局部变量遍历元素类型为型为string的数组中的每一个元素。该功能由的数组中的每一个元素。该功能由VarForeach()静态方法实现。静态方法实现。C#从入门到实践从入门到实践16.7 16.7 小结小结本章主要介绍了本章主要介绍了C#语言中的隐型变量、初始化器、匿名类语言中的隐型变量、初始化器、匿名类型和隐型数组,如声明隐型局部变量、使用隐型局部变型和隐型数组,如声明隐型局部变量、使用隐型局部变量、对象初始化器、集合初始化器、匿名类型、隐型数量、对象初始化器、集

278、合初始化器、匿名类型、隐型数组等。其中,读者要着重掌握声明隐型局部变量和使用组等。其中,读者要着重掌握声明隐型局部变量和使用隐型局部变量,为后续编写隐型局部变量,为后续编写C#程序代码奠定根底。下一程序代码奠定根底。下一章将要介绍章将要介绍C#语言中的迭代器、匿名方法和扩展方法。语言中的迭代器、匿名方法和扩展方法。C#从入门到实践从入门到实践16.8 16.8 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_16的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用

279、程序中。的文件添加到该应用程序中。2在该应用程序中使用隐型数组计算在该应用程序中使用隐型数组计算0100共共101个整个整数的和。数的和。C#从入门到实践从入门到实践第第1717章章 迭代器、匿名方法和扩展方法迭代器、匿名方法和扩展方法迭代器是一个语句块,它可以产生一系列有序值,从而使迭代器是一个语句块,它可以产生一系列有序值,从而使得得foreach语句可以访问该序列。匿名方法是一种特殊的语句可以访问该序列。匿名方法是一种特殊的方法,它由方法,它由delegate关键字、参数列表可选和包含关键字、参数列表可选和包含在在“和和“分隔符中的语句列表组成,并省略了方分隔符中的语句列表组成,并省略了

280、方法的名称。扩展方法可以向现有的类型法的名称。扩展方法可以向现有的类型“添加新的方添加新的方法,它是一种静态方法,通过扩展类型的实例来调用扩法,它是一种静态方法,通过扩展类型的实例来调用扩展方法。本章将讲解展方法。本章将讲解C#语言中的迭代器、匿名方法和扩语言中的迭代器、匿名方法和扩展方法,主要介绍以下知识点。展方法,主要介绍以下知识点。创立非泛型和泛型迭代器;创立非泛型和泛型迭代器;非泛型和泛型枚举器;非泛型和泛型枚举器;创立匿名方法;创立匿名方法;将匿名方法作为参数传递;将匿名方法作为参数传递;声明扩展方法;声明扩展方法;调用扩展方法。调用扩展方法。C#从入门到实践从入门到实践17.1 1

281、7.1 迭代器迭代器迭代器迭代器iterator是一个产生是一个产生yield有序值序列的语句有序值序列的语句块块block。它也可以通过。它也可以通过yield关键字对数组或集合类关键字对数组或集合类执行自定义迭代。迭代器包含以下两个特有的语句。执行自定义迭代。迭代器包含以下两个特有的语句。yield return语句,产生迭代的下一个值。语句,产生迭代的下一个值。yield break语句,指示迭代完成。语句,指示迭代完成。当迭代器执行到当迭代器执行到yield return语句时,迭代器会保存当前位语句时,迭代器会保存当前位置。如果该迭代器再一次被调用时,该迭代器将从上述置。如果该迭代器

282、再一次被调用时,该迭代器将从上述保存的位置重新开始执行。迭代器可以产生一系列的值,保存的位置重新开始执行。迭代器可以产生一系列的值,而且所有值的类型均相同,该类型称为迭代器的返回类而且所有值的类型均相同,该类型称为迭代器的返回类型,又称为产生类型。型,又称为产生类型。C#从入门到实践从入门到实践17.1.1 17.1.1 创立非泛型迭代器创立非泛型迭代器IEnumerable接口表示公开枚举数,该枚举数支持在非泛型接口表示公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。集合上进行简单迭代。IEnumerable接口只包含接口只包含GetEnumerator()方法,它返回一个循环访问集合的

283、枚举数。创立一个方法,它返回一个循环访问集合的枚举数。创立一个非泛型迭代器最常用的方法是实现非泛型迭代器最常用的方法是实现IEnumerable接口的接口的GetEnumerator()方法。方法。C#从入门到实践从入门到实践17.1.2 17.1.2 创立泛型迭代器创立泛型迭代器如果要创立一个泛型迭代器,往往需要实现如果要创立一个泛型迭代器,往往需要实现IEnumerable和和IEnumerable接口的接口的GetEnumerator()方法。方法。C#从入门到实践从入门到实践17.1.3 IEnumerator17.1.3 IEnumerator和和IEnumeratorIEnumer

284、ator接口接口IEnumerator表示枚举器的非泛型接口,支持对非泛型集合表示枚举器的非泛型接口,支持对非泛型集合的简单迭代。的简单迭代。IEnumerator表示枚举器的泛型接口,表示枚举器的泛型接口,支持泛型集合的简单迭代。支持泛型集合的简单迭代。1IEnumerator接口接口2IEnumerator接口接口C#从入门到实践从入门到实践17.2 17.2 匿名方法匿名方法顾名思义,匿名方法顾名思义,匿名方法anonymous method是一种隐藏了是一种隐藏了名称的方法。在版本之前,声明委托的唯一方法是使用名称的方法。在版本之前,声明委托的唯一方法是使用命名方法,即方法必须指定其名

285、称。引入了匿名方法实命名方法,即方法必须指定其名称。引入了匿名方法实现了同样的功能,及其以上版本,使用现了同样的功能,及其以上版本,使用Lambda表达式表达式第第18章取代了匿名方法,它比匿名方法更加简洁。章取代了匿名方法,它比匿名方法更加简洁。匿名方法允许与委托关联的代码以匿名方法允许与委托关联的代码以“内联方式写入使用内联方式写入使用委托的位置,从而方便地将代码直接委托的位置,从而方便地将代码直接“绑定到委托实绑定到委托实例。例。C#从入门到实践从入门到实践17.2.1 17.2.1 创立匿名方法创立匿名方法匿名方法由匿名方法由delegate关键字、参数列表可选和包含在关键字、参数列表

286、可选和包含在“和和“分隔符中的语句列表组成。从匿名方法的分隔符中的语句列表组成。从匿名方法的组成元素可以看到,匿名方法已经省略了该方法的名称。组成元素可以看到,匿名方法已经省略了该方法的名称。C#从入门到实践从入门到实践17.2.2 17.2.2 将匿名方法作为参数传递将匿名方法作为参数传递正是因为匿名方法允许与委托关联的代码以正是因为匿名方法允许与委托关联的代码以“内联方式,内联方式,从而使得可以将匿名方法作为方法的参数来传递。从而使得可以将匿名方法作为方法的参数来传递。C#从入门到实践从入门到实践17.3 17.3 扩展方法扩展方法扩展方法可以使得开发人员能够向现有类型扩展方法可以使得开发

287、人员能够向现有类型“添加新的添加新的方法,而且不需要创立新的派生类型、重新编译或以其方法,而且不需要创立新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种静态方法,可以他方式修改原始类型。扩展方法是一种静态方法,可以通过扩展类型的实例来调用扩展方法。通过扩展类型的实例来调用扩展方法。C#从入门到实践从入门到实践17.3.1 17.3.1 声明扩展方法声明扩展方法声明扩展方法时,需要使用声明扩展方法时,需要使用this修饰符。扩展方法的第一个修饰符。扩展方法的第一个参数指定该方法所作用的类型,并使用参数指定该方法所作用的类型,并使用this修饰符作为修饰符作为该参数的前缀。该参数的前

288、缀。C#从入门到实践从入门到实践17.3.2 17.3.2 导入扩展方法导入扩展方法导入扩展方法比较简单,只要使用导入扩展方法比较简单,只要使用using指令引入扩展方法指令引入扩展方法所在的命名空间即可。实际上,被导入的扩展方法作为所在的命名空间即可。实际上,被导入的扩展方法作为其第一个参数的类型上的附加方法。其第一个参数的类型上的附加方法。C#从入门到实践从入门到实践17.3.3 17.3.3 调用扩展方法调用扩展方法使用使用using指令导入指令导入ToInt32(this string str)扩展方法之后,扩展方法之后,就可以调用该扩展方法了。就可以调用该扩展方法了。C#从入门到实践

289、从入门到实践17.4 17.4 实例一:扩展实例一:扩展stringstring类型的方法类型的方法【实例【实例17-1】为】为string类型扩展了一个方法,该方法的名称类型扩展了一个方法,该方法的名称为为“ToInt32(this string str),它可以将一个字符串,它可以将一个字符串转换为一个整数。转换为一个整数。C#从入门到实践从入门到实践17.5 17.5 小结小结本章主要介绍了本章主要介绍了C#语言中的迭代器、匿名方法和扩展方法,语言中的迭代器、匿名方法和扩展方法,如创立非泛型和泛型迭代器、非泛型和泛型枚举器、创如创立非泛型和泛型迭代器、非泛型和泛型枚举器、创立匿名方法、将

290、匿名方法作为参数传递、声明扩展方法、立匿名方法、将匿名方法作为参数传递、声明扩展方法、调用扩展方法等。其中,读者要着重掌握创立非泛型和调用扩展方法等。其中,读者要着重掌握创立非泛型和泛型迭代器和创立匿名的方法,为后续编写泛型迭代器和创立匿名的方法,为后续编写C#程序代码程序代码奠定根底。下一章将要介绍奠定根底。下一章将要介绍C#语言中的语言中的Lambda表达式表达式和查询表达式。和查询表达式。C#从入门到实践从入门到实践17.6 17.6 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_17的控制台应用程序,并实现以下功能。的控制台

291、应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2在该应用程序中创立一个泛型迭代器,并使用该迭代在该应用程序中创立一个泛型迭代器,并使用该迭代器。器。C#从入门到实践从入门到实践第第1818章章 Lambda Lambda表达式和查询表达式表达式和查询表达式C#提供了一种可以用来查询集合、提供了一种可以用来查询集合、XML、DataSet数据数据集和数据库的技术,并使用集和数据库的技术,并使用Lambda表达式和查询表表达式和查询表达式实现这种查询技术。达式实现这种查询技术。Lambda表达式其实是一种简表达式其实是一种简写的

292、匿名函数,它可以包含表达式和写的匿名函数,它可以包含表达式和C#语句。查询表达语句。查询表达式是一种使用查询语法表示的表达式,它可以从一个或式是一种使用查询语法表示的表达式,它可以从一个或多个给定的数据源中检索数据,并指定检索结果的表现多个给定的数据源中检索数据,并指定检索结果的表现形式。本章将讲解形式。本章将讲解C#语言中的语言中的Lambda表达式和查询表表达式和查询表达式,主要介绍以下知识点。达式,主要介绍以下知识点。Lambda表达式;表达式;from子句;子句;select子句;子句;where子句;子句;let子句;子句;orderby子句;子句;group子句;子句;into子句

293、;子句;join子句。子句。C#从入门到实践从入门到实践18.1 Lambda18.1 Lambda表达式表达式和匿名方法一样,和匿名方法一样,Lambda表达式也是一种匿名函数表达式也是一种匿名函数anonymous function,它可以包含表达式和语句,并,它可以包含表达式和语句,并且可用于创立委托或表达式目录树类型。但是,且可用于创立委托或表达式目录树类型。但是,Lambda表达式比匿名方法具有更加简洁的表示形式。表达式比匿名方法具有更加简洁的表示形式。Lambda表达式可以由输入参数、表达式可以由输入参数、Lambda运算符和表达运算符和表达式或语句块构成,它的语法形式如下。式或语

294、句块构成,它的语法形式如下。(input parameters) = expression;input parameters表示输入参数,它是可选的;表示输入参数,它是可选的;“=为为Lambda运算符读作运算符读作“goes to;expression表示表表示表达式或语句块。达式或语句块。C#从入门到实践从入门到实践18.1.1 18.1.1 输入参数输入参数在在Lambda表达式中,输入参数是表达式中,输入参数是Lambda运算符的左边局运算符的左边局部。它包含参数的数量可以为部。它包含参数的数量可以为0,1或者多个。当输入参或者多个。当输入参数的数量为数的数量为0时,时,Lambda表

295、达式的左边局部的一对小括表达式的左边局部的一对小括弧不能被省略。弧不能被省略。C#从入门到实践从入门到实践18.1.2 18.1.2 表达式或语句块表达式或语句块在在Lambda表达式中,表达式中,Lambda运算符的右边局部可以是一运算符的右边局部可以是一个表达式或由多个表达式组成的语句块。个表达式或由多个表达式组成的语句块。C#从入门到实践从入门到实践18.2 18.2 查询表达式查询表达式查询表达式查询表达式Query expression是一种使用查询语法表示是一种使用查询语法表示的表达式,由一组类似与的表达式,由一组类似与SQL或或XQuery的声明性语法编的声明性语法编写的子句组成

296、。每一个子句可以包含一个或多个写的子句组成。每一个子句可以包含一个或多个C#表达表达式,这些式,这些C#表达式本身也可能是查询表达式或包含查询表达式本身也可能是查询表达式或包含查询表达式。查询表达式包括表达式。查询表达式包括8个根本子句,具体说明如下。个根本子句,具体说明如下。from子句子句select子句子句where子句子句let子句子句orderby子句子句group子句子句into子句子句join子句子句查询表达式必须以查询表达式必须以from子句开头,以子句开头,以select或或group子句结子句结束。在第一个束。在第一个from子句和最后一个子句和最后一个select子句或子

297、句或group子子句之间,可以包含一个或多个句之间,可以包含一个或多个where子句、子句、let子句、子句、join子句、子句、orderby子句和子句和group子句,甚至还可以是子句,甚至还可以是from子子句。句。C#从入门到实践从入门到实践18.2.1 from18.2.1 from子句子句任何一个查询表达式,不管是否为子查询表达式,它必须任何一个查询表达式,不管是否为子查询表达式,它必须包含包含from子句,且以子句,且以from子句开头。子句开头。from子句用来指定子句用来指定查询表达式的数据源和范围变量。数据源不但可以包括查询表达式的数据源和范围变量。数据源不但可以包括查询本

298、身的数据源,而且还可以包括子查询的数据源。查询本身的数据源,而且还可以包括子查询的数据源。范围变量用来表示数据源序列中的每一个元素。范围变量用来表示数据源序列中的每一个元素。1数据源数据源2包含单个包含单个from子句的查询表达式子句的查询表达式3包含多个包含多个from子句的查询表达式子句的查询表达式4包含复合包含复合from子句的查询表达式子句的查询表达式C#从入门到实践从入门到实践18.2.2 select18.2.2 select子句子句select子句指定查询结果的类型和表现形式,即指定将在执子句指定查询结果的类型和表现形式,即指定将在执行查询时产生的值的类型。行查询时产生的值的类型

299、。select子句结果及其表现形式子句结果及其表现形式与其前面所有子句的计算结果,以及本身中的所有表达与其前面所有子句的计算结果,以及本身中的所有表达式相关。一个查询表达式要么以式相关。一个查询表达式要么以select子句结束,要么以子句结束,要么以group子句结束。子句结束。C#从入门到实践从入门到实践18.2.3 where18.2.3 where子句子句where子句指定筛选元素的逻辑条件,即用来确定从查询表子句指定筛选元素的逻辑条件,即用来确定从查询表达式中选择哪些元素。达式中选择哪些元素。where子句由一个或多个布尔表子句由一个或多个布尔表达式,以及逻辑运算符如逻辑与、逻辑或等组

300、成。达式,以及逻辑运算符如逻辑与、逻辑或等组成。一个查询表达式可以包含一个或多个一个查询表达式可以包含一个或多个where子句。在查子句。在查询表达式中,询表达式中,where子句不能出现在查询表达式的第一子句不能出现在查询表达式的第一个子句或最后一个子句的位置,其他任何位置都可以放个子句或最后一个子句的位置,其他任何位置都可以放置置where子句。子句。C#从入门到实践从入门到实践18.2.4 let18.2.4 let子句子句let子句可以创立一个新的范围变量,用来保存查询表达式子句可以创立一个新的范围变量,用来保存查询表达式中的中间结果。中的中间结果。let子句创立的范围变量是一个只读变

301、量,子句创立的范围变量是一个只读变量,它的值只能通过初始化操作赋值。一旦设定了范围变量它的值只能通过初始化操作赋值。一旦设定了范围变量的值之后,它的值将不能被修改。当然,可以查询该范的值之后,它的值将不能被修改。当然,可以查询该范围变量的值。围变量的值。C#从入门到实践从入门到实践18.2.5 orderby18.2.5 orderby子句子句orderby子句可以对查询结果进行排序,排序方式为子句可以对查询结果进行排序,排序方式为“升序升序由由ascending关键字指定和关键字指定和“降序由降序由descending关键字指定。关键字指定。C#从入门到实践从入门到实践18.2.6 grou

302、p18.2.6 group子句子句group子句使用子句使用by关键字可以对查询的结果进行分组,关键字可以对查询的结果进行分组,并返回元素类型为并返回元素类型为IGrouping的序列。的序列。其中,其中,TKey为分组中键的类型,为分组中键的类型,TElement为分组中元为分组中元素的类型。素的类型。C#从入门到实践从入门到实践18.2.7 into18.2.7 into子句子句into子句可以创立一个临时标识符,并用来保存子句可以创立一个临时标识符,并用来保存group子句、子句、join子句或子句或selet子句的结果,以供其他子句查询该结果。子句的结果,以供其他子句查询该结果。有时,

303、称在有时,称在group或或select子句中使用新标识符的用法为子句中使用新标识符的用法为“延续。延续。C#从入门到实践从入门到实践18.2.8 join18.2.8 join子句子句join子句是查询表达式中比较复杂的一个子句,它和子句是查询表达式中比较复杂的一个子句,它和SQL语语句中的句中的JOIN子句比较相似,可以用来联接两个数据源,子句比较相似,可以用来联接两个数据源,即设置两个数据源之间的关系。一般情况下,这两个数即设置两个数据源之间的关系。一般情况下,这两个数据源是存在相关联的属性或值,以供这两个数据源中的据源是存在相关联的属性或值,以供这两个数据源中的元素进行比较。特别地,元

304、素进行比较。特别地,join子句可以使用子句可以使用equals关键字关键字比较元素的指定属性是否相等。比较元素的指定属性是否相等。join子句支持以下子句支持以下3种常种常见联接方式。见联接方式。内部联接,元素的联接关系必须同时满足两个数据源,类内部联接,元素的联接关系必须同时满足两个数据源,类似于似于SQL语句中的语句中的INNER JOIN子句。子句。分组联接,包含分组联接,包含into子句的子句的join子句。子句。左外部联接,元素的联接关系必须满足联接中的左数据源,左外部联接,元素的联接关系必须满足联接中的左数据源,类似于类似于SQL语句中的语句中的LEFT JOIN子句。子句。C#

305、从入门到实践从入门到实践18.3 18.3 实例一:使用实例一:使用LambdaLambda表达式查询表达式查询XMLXML【实例【实例18-1】在】在QueryXml()方法中介绍使用方法中介绍使用Lambda表达式表达式查询查询XML类的方法。类的方法。C#从入门到实践从入门到实践18.4 18.4 小结小结本章主要介绍了本章主要介绍了C#语言中的查询表达式,如语言中的查询表达式,如Lambda表达表达式、式、from子句、子句、select子句、子句、where子句、子句、let子句、子句、orderby子句、子句、group子句、子句、into子句、子句、join子句等。其中,子句等。

306、其中,读者要着重掌握读者要着重掌握Lambda表达式,以及使用表达式,以及使用Lambda表达表达式查询集合、式查询集合、XML文件的方法,为后续编写文件的方法,为后续编写C#程序代程序代码奠定根底。下一章将要介绍使用码奠定根底。下一章将要介绍使用C#语言处理字符串的语言处理字符串的方法。方法。C#从入门到实践从入门到实践18.5 18.5 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_18的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到

307、该应用程序中。2创立一个查询表达式,并使用该查询表达式从一段文创立一个查询表达式,并使用该查询表达式从一段文本中查询所有单词。本中查询所有单词。C#从入门到实践从入门到实践第第1919章章 字符串处理字符串处理字符串类型是字符串类型是C#编程语言中最为常用的一种数据类型编程语言中最为常用的一种数据类型,.NET Framework为字符串提供了丰富地操作和处理方为字符串提供了丰富地操作和处理方法。通过这些方法,开发人员可以轻松简单地处理字符法。通过这些方法,开发人员可以轻松简单地处理字符串。本章将讲解串。本章将讲解.NET Framework中处理字符串的方法,中处理字符串的方法,主要介绍以下

308、知识点。主要介绍以下知识点。lString类;类;lStringBuilder类;类;l不变字符串处理;不变字符串处理;l可变字符串处理。可变字符串处理。C#从入门到实践从入门到实践19.1 String19.1 String和和StringBuilderStringBuilder类类在在.NET Framework中,字符串可以分为两种类型:不变字中,字符串可以分为两种类型:不变字符串由符串由String类表示和可变字符串由类表示和可变字符串由StringBuilder类表示。不变字符串一旦被创立,那么类表示。不变字符串一旦被创立,那么它的内容是不能被修改的;而可变字符串被创立之后,它的内容

309、是不能被修改的;而可变字符串被创立之后,它的内容是可以动态修改的。它的内容是可以动态修改的。C#从入门到实践从入门到实践19.1.1 String19.1.1 String类类String类表示一系列的有序类表示一系列的有序Unicode字符,用来表示文本。字符,用来表示文本。String对象是字符对象是字符Char对象的有序集合,用来表示对象的有序集合,用来表示字符串。字符串。String对象的值是该有序集合的内容,并且该对象的值是该有序集合的内容,并且该值是不可变的,即一旦创立了一个值是不可变的,即一旦创立了一个String对象,那么就对象,那么就不能修改该对象的值。虽然有些方法看起来修改

310、了不能修改该对象的值。虽然有些方法看起来修改了String对象,而实际上是返回了一个包含修改后内容的对象,而实际上是返回了一个包含修改后内容的新的新的String对象。对象。C#从入门到实践从入门到实践19.1.2 StringBuilder19.1.2 StringBuilder类类StringBuilder类表示可变字符串,可以创立能够动态修改类表示可变字符串,可以创立能够动态修改如追加、移除、替换、插入等的字符串对象。如追加、移除、替换、插入等的字符串对象。C#从入门到实践从入门到实践19.2 19.2 不变字符串处理不变字符串处理不变字符串由不变字符串由String类表示是不能被修改的

311、。对不变字类表示是不能被修改的。对不变字符串的每一次处理都将产生一个新的字符串。不变字符符串的每一次处理都将产生一个新的字符串。不变字符串处理的方法主要包括插入字符串、移除字符串、替换串处理的方法主要包括插入字符串、移除字符串、替换字符串、联接字符串、分隔字符串、填充字符串等。下字符串、联接字符串、分隔字符串、填充字符串等。下面将详细介绍这些方法。面将详细介绍这些方法。C#从入门到实践从入门到实践19.2.1 19.2.1 插入字符串插入字符串插入字符串是将新的字符串插入到字符串的指定位置,该插入字符串是将新的字符串插入到字符串的指定位置,该功能由功能由String类的类的Insert()方法

312、实现。方法实现。Insert()方法的原型方法的原型如下。如下。public string Insert(int startIndex,string value)上述方法将上述方法将value参数指定字符串插入到字符串的参数指定字符串插入到字符串的startIndex指定的位置。指定的位置。startIndex参数表示插入的位置即索引值,参数表示插入的位置即索引值,value参数参数表示被插入的新字符串。上述方法返回一个新的字符串。表示被插入的新字符串。上述方法返回一个新的字符串。C#从入门到实践从入门到实践19.2.2 19.2.2 移除字符串移除字符串移除字符串是从字符串中指定位置开始移除

313、其后的所有字移除字符串是从字符串中指定位置开始移除其后的所有字符或指定数量的字符,该功能由符或指定数量的字符,该功能由String类的类的Remove()方方法实现。法实现。Remove()方法的原型如下。方法的原型如下。lpublic string Remove(int startIndex),从,从startIndex位置位置开始移除其后的所有字符。开始移除其后的所有字符。lpublic string Remove(int startIndex,int count),从,从startIndex位置开始移除其后的数量为位置开始移除其后的数量为count的字符。的字符。C#从入门到实践从入门到

314、实践19.2.3 19.2.3 替换字符串替换字符串替换字符是指将字符串中指定字符替换为新的字符,或者替换字符是指将字符串中指定字符替换为新的字符,或者将指定的字符串替换为新的字符串,该功能由将指定的字符串替换为新的字符串,该功能由String类类的的Replace()方法实现。方法实现。Replace()方法的原型如下。方法的原型如下。lpublic string Replace(char oldChar,char newChar),将将字符串中指定字符替换为新的字符。字符串中指定字符替换为新的字符。lpublic string Replace(string oldValue,string

315、newValue),将字符串中指定字符串替换为新的字符串。将字符串中指定字符串替换为新的字符串。loldChar参数表示被替换的字符,参数表示被替换的字符,newChar参数表示替换参数表示替换后的字符。后的字符。oldValue参数表示被替换的字符串,参数表示被替换的字符串,newValue参数表示替换后的字符串。参数表示替换后的字符串。C#从入门到实践从入门到实践19.2.4 19.2.4 联接字符串联接字符串联接字符串是将一个或多个字符串对象联接为一个新的字联接字符串是将一个或多个字符串对象联接为一个新的字符串,该功能由符串,该功能由String类的类的Concat()方法或方法或Joi

316、n()方法实方法实现。其中,现。其中,Concat()方法的最常用的方法的最常用的4种原型如下。种原型如下。public static string Concat(object arg0),联接,联接arg0对象的字对象的字符串表示形式,并创立一个新的字符串。符串表示形式,并创立一个新的字符串。public static string Concat(string str0,string str1),联接,联接str0和和str1字符串,并创立一个新的字符串。字符串,并创立一个新的字符串。public static string Concat(string str0,string str1,st

317、ring str2),联接,联接str0、str1和和str2字符串,并创立一个新的字符串。字符串,并创立一个新的字符串。public static string Concat(string str0,string str1,string str2,string str3),联接,联接str0、str1、str2和和str3字符串,并字符串,并创立一个新的字符串。创立一个新的字符串。C#从入门到实践从入门到实践19.2.5 19.2.5 分隔字符串分隔字符串分隔字符串是将一个字符串被指定的分隔字符或字符串分隔为多个子分隔字符串是将一个字符串被指定的分隔字符或字符串分隔为多个子字符串,并返回由子

318、字符串组成的字符串数组。该功能由字符串,并返回由子字符串组成的字符串数组。该功能由String类类的的Split()方法实现,它的原型如下。方法实现,它的原型如下。lpublic string Split(params char separator)。lpublic string Split(char separator,int count)。lpublic string Split(char separator,StringSplitOptions options)。lpublic string Split(string separator,StringSplitOptions option

319、s)。lpublic string Split(char separator,int count,StringSplitOptions options)。lpublic string Split(string separator,int count,StringSplitOptions options)。C#从入门到实践从入门到实践19.2.6 19.2.6 填充字符串填充字符串填充字符串是向字符串的指定位置填充指定的字符,该功填充字符串是向字符串的指定位置填充指定的字符,该功能由能由String类的类的PadRight()和和PadLeft()方法实现。其中,方法实现。其中,PadRight

320、()方法在字符串的右边填充字符,方法在字符串的右边填充字符,PadLeft()方法在字符方法在字符串的左边填充字符串。由于这两个方法比较相似,下面串的左边填充字符串。由于这两个方法比较相似,下面只将介绍只将介绍PadLeft()方法。方法。PadLeft()方法的原型如下。方法的原型如下。public string PadLeft(int totalWidth),在字符串的左边填,在字符串的左边填充空白字符,填充之后,新字符串的总长度为充空白字符,填充之后,新字符串的总长度为totalWidthpublic string PadLeft(int totalWidth,char paddingC

321、har),在字符串的左边填充在字符串的左边填充paddingChar字符,填充之后,新字符,填充之后,新字符串的总长度为字符串的总长度为totalWidth。C#从入门到实践从入门到实践19.2.7 19.2.7 查找字符串查找字符串查找字符串是指从字符串中查找指定的字符或子字符串。查找字符串是指从字符串中查找指定的字符或子字符串。如果找到,那么返回第一个匹配字符或字符串的索引;如果找到,那么返回第一个匹配字符或字符串的索引;否那么返回否那么返回-1。该功能由。该功能由String类的类的IndexOf()和和LastIndexOf()方法实现。其中,方法实现。其中,IndexOf()方法是从

322、字符串的第一个方法是从字符串的第一个字符开始依照从头到尾的方式查找,字符开始依照从头到尾的方式查找,LastIndexOf()方法方法从字符串的最后一个字符开始依照从尾到头的方式查找。从字符串的最后一个字符开始依照从尾到头的方式查找。C#从入门到实践从入门到实践19.2.8 19.2.8 获取子串获取子串获取子串是指从字符串中获取指定的子字符串,该功能由获取子串是指从字符串中获取指定的子字符串,该功能由String类的类的SubString()方法实现,它的原型如下。方法实现,它的原型如下。lpublic string SubString(int startIndex),获取字符串中获取字符串

323、中从从startIndex位置开始的子字符串。位置开始的子字符串。lpublic string SubString(int startIndex,int length),获取获取字符串中从字符串中从startIndex位置开始的、最大长度为位置开始的、最大长度为length的的子字符串。子字符串。C#从入门到实践从入门到实践19.2.9 19.2.9 格式化字符串格式化字符串格式化字符串是指将字符串转化为指定格式的字符串,该格式化字符串是指将字符串转化为指定格式的字符串,该功能由功能由String类的类的Format()方法实现。方法实现。1数字格式化数字格式化2日期和时间格式化日期和时间格式

324、化C#从入门到实践从入门到实践19.3 19.3 可变字符串处理可变字符串处理可变字符串由可变字符串由StringBuilder类表示是一种动态字符串,类表示是一种动态字符串,它是可以被动态修改的。动态修改可变字符串的方法主它是可以被动态修改的。动态修改可变字符串的方法主要包括插入字符串、追加字符串、移除字符串、替换字要包括插入字符串、追加字符串、移除字符串、替换字符串、复制字符串等。下面将详细介绍这些方法。符串、复制字符串等。下面将详细介绍这些方法。C#从入门到实践从入门到实践19.3.1 19.3.1 插入字符串插入字符串插入字符串是将新的字符串插入到字符串的指定位置,该插入字符串是将新的

325、字符串插入到字符串的指定位置,该功能由功能由StringBuilder类的类的Insert()方法实现。方法实现。Insert()方法方法存在多种原型,常见的原型如下。存在多种原型,常见的原型如下。lpublic StringBuilder Insert(int index,string value),将,将value插入到字符串的插入到字符串的index指定的位置。指定的位置。lpublic StringBuilder Insert(int index,string value,int count),将,将value插入到字符串的插入到字符串的index指定的位置,并重指定的位置,并重复执行

326、该超载复执行该超载count次。次。C#从入门到实践从入门到实践19.3.2 19.3.2 追加字符串追加字符串追加字符串是指将指定的字符或字符串追加到字符串的末追加字符串是指将指定的字符或字符串追加到字符串的末尾,该功能由尾,该功能由StringBuilder类的类的Append()、AppendLine()和和AppendFormat()方法实现。其中,方法实现。其中,AppendLine()方方法在追加指定的字符串之后,还追加一个换行符号;法在追加指定的字符串之后,还追加一个换行符号;AppendFormat()方法首先格式化被追加的字符串,然后将其追加到字方法首先格式化被追加的字符串,

327、然后将其追加到字符串。下面仅仅介绍符串。下面仅仅介绍Append()方法的用法。方法的用法。C#从入门到实践从入门到实践19.3.3 19.3.3 移除字符串移除字符串移除字符串是从字符串中指定位置开始移除其后的指定数移除字符串是从字符串中指定位置开始移除其后的指定数量的字符,该功能由量的字符,该功能由StringBuilder类的类的Remove()方法实方法实现,它的原型如下。现,它的原型如下。lpublic StringBuilder Remove(int startIndex,int length)。从字符串中从字符串中startIndex位置处开始移除其后的位置处开始移除其后的cou

328、nt个的个的字符字符lstartIndex参数表示移除的开始位置,参数表示移除的开始位置,count参数表示被参数表示被移除字符串的最大字符串数量。移除字符串的最大字符串数量。C#从入门到实践从入门到实践19.3.4 19.3.4 替换字符串替换字符串替换字符是指将字符串中指定字符替换为新的字符,或者替换字符是指将字符串中指定字符替换为新的字符,或者将指定的字符串替换为新的字符串,该功能由将指定的字符串替换为新的字符串,该功能由StringBuilder类的类的Replace()方法实现。方法实现。C#从入门到实践从入门到实践19.3.5 19.3.5 复制字符串复制字符串复制字符串是指将字符

329、串的内容复制到指定的字符数组中,复制字符串是指将字符串的内容复制到指定的字符数组中,该功能由该功能由StringBuilder类的类的CopyTo()方法实现,它的原方法实现,它的原型如下。型如下。public void CopyTo(int sourceIndex,char destination,int destinationIndex,int count)。sourceIndex参数指定被复制字符串中的开始位置;参数指定被复制字符串中的开始位置;destination参数指定将字符复制到的字符数组,用来保参数指定将字符复制到的字符数组,用来保存被复制的字符;存被复制的字符;destina

330、tionIndex参数指定保存复制字参数指定保存复制字符的数组中的起始位置;符的数组中的起始位置;count参数指定被复制字符的数参数指定被复制字符的数量。量。C#从入门到实践从入门到实践19.4 19.4 实例一:词频统计实例一:词频统计【实例【实例19-1】使用处理字符串的方法统计给定一段文本中】使用处理字符串的方法统计给定一段文本中所有单词出现的频率,并按照此频率倒序显示每一个单所有单词出现的频率,并按照此频率倒序显示每一个单词的出现的频率。词的出现的频率。C#从入门到实践从入门到实践19.5 19.5 小结小结本章主要介绍了使用本章主要介绍了使用C#语言处理字符串的方法,如语言处理字符

331、串的方法,如String类、类、StringBuilder类、不变字符串处理、可变字符串处类、不变字符串处理、可变字符串处理等。其中,读者要着重掌握不变字符串处理和可变字理等。其中,读者要着重掌握不变字符串处理和可变字符串处理的方法,为后续编写符串处理的方法,为后续编写C#程序代码奠定根底。下程序代码奠定根底。下一章将要介绍一章将要介绍C#语言中的日期和时间处理。语言中的日期和时间处理。C#从入门到实践从入门到实践19.6 19.6 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_19的控制台应用程序,并实现以下功能。的控制台应用程序

332、,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2在该应用程序分别对静态字符串和动态字符串实现查在该应用程序分别对静态字符串和动态字符串实现查找、插入、替换、移除指定字符串的功能。找、插入、替换、移除指定字符串的功能。C#从入门到实践从入门到实践第第2020章章 日期和时间处理日期和时间处理日期和时间处理是日期和时间处理是C#编程中最为常见的操作之一。在编程中最为常见的操作之一。在.NET Framework中,与日期和时间相关的结构为中,与日期和时间相关的结构为DateTime和和TimeSpan。DateTime结构表示时间上的某

333、一刻,结构表示时间上的某一刻,TimeSpan结构表示时间间隔。本章将讲解结构表示时间间隔。本章将讲解C#编程中的编程中的日期和时间处理,主要介绍以下知识点。日期和时间处理,主要介绍以下知识点。lDateTime结构;结构;lTimeSpan结构;结构;l格式化日期和时间;格式化日期和时间;l计算日期和时间差;计算日期和时间差;l追加日期和时间。追加日期和时间。C#从入门到实践从入门到实践20.1 DateTime20.1 DateTime结构结构DateTime是一个结构,且为值类型,表示时间上的一刻,是一个结构,且为值类型,表示时间上的一刻,包括日期和时间两局部。包括日期和时间两局部。Da

334、teTime表示的值的范围为公表示的值的范围为公元元0001年年1月月1日午夜日午夜12:00:00到公元到公元9999年年12月月31日晚日晚上上11:59:59之间的日期和时间。之间的日期和时间。DateTime表示的日期和表示的日期和时间由年、月、日、时、分、秒,以及分隔符组成。最时间由年、月、日、时、分、秒,以及分隔符组成。最常用的一种格式如下所示。常用的一种格式如下所示。yyyy-MM-dd hh:mm:ssC#从入门到实践从入门到实践20.1.1 20.1.1 字段字段DateTime结构只包含两个静态只读字段:结构只包含两个静态只读字段:MaxValue和和MinValue,它们

335、的具体说明如下。,它们的具体说明如下。lMaxValue字段,字段,DateTime的最大可能值,它的值为的最大可能值,它的值为9999年年12月月31日日 。lMinValue字段,字段,DateTime的最小可能值,它的值为的最小可能值,它的值为0001年年1月月1日日 。C#从入门到实践从入门到实践20.1.2 20.1.2 属性属性DateTime结构包含结构包含16个属性。其中,个属性。其中,Now、Today和和UtcNow属性为静态属性,其他属性为实例属性。通过这属性为静态属性,其他属性为实例属性。通过这16个属性,可以获取时间的值或时间某一个局部的值,个属性,可以获取时间的值或

336、时间某一个局部的值,如年份、月份、日期、小时、分钟、秒等。如年份、月份、日期、小时、分钟、秒等。C#从入门到实践从入门到实践20.1.3 20.1.3 方法方法DateTime结构共包括个结构共包括个38方法,其中,静态方法方法,其中,静态方法13个,实个,实例方法例方法25个。个。C#从入门到实践从入门到实践20.2 TimeSpan20.2 TimeSpan结构结构TimeSpan结构表示一个时间间隔或持续时间,可以按照正结构表示一个时间间隔或持续时间,可以按照正负天数、小时数、分钟数、秒数以及秒的小数局部进行负天数、小时数、分钟数、秒数以及秒的小数局部进行度量。度量。TimeSpan值表

337、示为值表示为“-d.hh:mm:ss.ff格式的字符串。格式的字符串。减号可选表示负时间间隔;减号可选表示负时间间隔;d分量表示天数;分量表示天数;hh表表示小时数示小时数24小时制;小时制;mm表示分钟数;表示分钟数;ss表示秒的整表示秒的整数局部,数局部,ff为秒的小数局部。如为秒的小数局部。如“9.1:40:58表示表示9天、天、1小时、小时、40分钟和分钟和58秒。秒。C#从入门到实践从入门到实践20.2.1 20.2.1 字段字段TimeSpan结构包含以下结构包含以下8个静态字段,如个静态字段,如MaxValue、MinValue等,它们的具体说明如下。等,它们的具体说明如下。Ma

338、xValue字段,最大的字段,最大的TimeSpan值,它的值为。值,它的值为。MinValue字段,最小的字段,最小的TimeSpan值,它的值为。值,它的值为。Zero字段,零字段,零TimeSpan值,它的值为值,它的值为00:00:00。常常用于与其。常常用于与其他他TimeSpan对象的比较。对象的比较。TicksPerDay字段,一天中的刻度数,它的值为字段,一天中的刻度数,它的值为8,640亿。亿。TicksPerHour字段,字段,1小时的刻度数,它的值为小时的刻度数,它的值为360亿。亿。TicksPerMinute字段,字段,1分钟的刻度数,它的值为分钟的刻度数,它的值为6

339、亿。亿。TicksPerSecond字段,字段,1秒钟的刻度数,它的值为秒钟的刻度数,它的值为1,000万。万。TicksPerMillisecond字段,字段,1毫秒的刻度数,它的值为毫秒的刻度数,它的值为1万。万。C#从入门到实践从入门到实践20.2.2 20.2.2 属性属性TimeSpan结构包含结构包含11个实例属性。通过这个实例属性。通过这11个属性,可以获取个属性,可以获取TimeSpan对象的天数、小时数、分钟数、秒数、毫秒数等。对象的天数、小时数、分钟数、秒数、毫秒数等。TimeSpan结构的属性具体说明如表所示。结构的属性具体说明如表所示。属性说明Days获取TimeSpa

340、n对象的整天数。Hours获取TimeSpan对象的整小时数。Minutes获取TimeSpan对象的整分钟数。Seconds获取TimeSpan对象的整秒数。Milliseconds获取TimeSpan对象的整毫秒数。Ticks获取TimeSpan对象的刻度数。TotalDays获取TimeSpan对象的天数的整数部分和小数部分。TotalHours获取TimeSpan对象的小时数的整数部分和小数部分。TotalMinutes获取TimeSpan对象的分钟数的整数部分和小数部分。TotalSeconds获取TimeSpan对象的秒数的整数部分和小数部分。TotalMilliseconds获取

341、TimeSpan对象的毫秒数的整数部分和小数部分。C#从入门到实践从入门到实践20.2.3 20.2.3 方法方法TimeSpan结构共包括个结构共包括个16方法,其中,静态方法方法,其中,静态方法10个,实例方法个,实例方法6个。个。TimeSpan结构的静态方法具体说明如表所示。结构的静态方法具体说明如表所示。方法说明Compare()比较两个TimeSpan值,它的返回值可以是0、-1或1。Equals()判断两个TimeSpan结构的实例是否相等。如果是,则返回true,否则返回false。FromDays()根据指定的天数,创建一个TimeSpan结构的实例。FromHours()根

342、据指定的小时数,创建一个TimeSpan结构的实例。FromMinutes()根据指定的分钟数,创建一个TimeSpan结构的实例。FromSeconds()根据指定的秒数,创建一个TimeSpan结构的实例。FromMilliseconds()根据指定的毫秒数,创建一个TimeSpan结构的实例。FromTicks()根据指定的刻度数,创建一个TimeSpan结构的实例。Parse()将一个字符串转换为其相应的TimeSpan对象。TryParse()将一个字符串转换为其相应的TimeSpan对象。C#从入门到实践从入门到实践20.3 20.3 日期和时间的常用操作日期和时间的常用操作Dat

343、eTime结构是结构是C#编程中最为常用的一个结构之一。日期编程中最为常用的一个结构之一。日期和时间的常用操作主要包括日期和时间的格式化、计算和时间的常用操作主要包括日期和时间的格式化、计算日期和时间的差、追加日期和时间等。本小节将详细介日期和时间的差、追加日期和时间等。本小节将详细介绍这些操作。绍这些操作。C#从入门到实践从入门到实践20.3.1 20.3.1 格式化格式化日期和时间格式化是指将日期和时间格式化是指将DateTime结构的实例转换为其相对应的结构的实例转换为其相对应的某一种字符串表示形式。某一种字符串表示形式。DateTime结构提供了多个以结构提供了多个以“To开头开头的方

344、法。这些方法可以将的方法。这些方法可以将DateTime对象转换为不同格式的字符串对象转换为不同格式的字符串形式,常用的方法如表所示。形式,常用的方法如表所示。方法说明ToString()转换为其等效的字符串表示形式。ToLongDateString()转换为其等效的长日期字符串表示形式。ToShortDateString()转换为其等效的短日期字符串表示形式。ToLongTimeString()转换为其等效的长时间字符串表示形式。ToShortTimeString()转换为其等效的短时间字符串表示形式。C#从入门到实践从入门到实践20.3.2 20.3.2 计算时间差计算时间差计算时间差可以

345、使用计算时间差可以使用Subtract()方法。该方法可以计算两个方法。该方法可以计算两个时间的差值,也可以计算时间和时间间隔的差值。它存时间的差值,也可以计算时间和时间间隔的差值。它存在以下两种重载形式。在以下两种重载形式。lpublic TimeSpan Subtract(DateTime value),从当前实从当前实例中减去指定的日期和时间,返回类型为例中减去指定的日期和时间,返回类型为TimeSpan。其其中,中,value参数表示被减去的日期和时间。参数表示被减去的日期和时间。lpublic DateTime Subtract(TimeSpan value),从当前实从当前实例中减

346、去指定的时间间隔,返回类型为例中减去指定的时间间隔,返回类型为DateTime。其中,其中,value参数表示被减去的时间间隔。参数表示被减去的时间间隔。C#从入门到实践从入门到实践20.3.3 20.3.3 追加时间追加时间追加时间是指将指定的时间或时间局部如年份、月份、小时等追加时间是指将指定的时间或时间局部如年份、月份、小时等追加到一个时间上,并计算出一个新的时间。追加到一个时间上,并计算出一个新的时间。DateTime结构提结构提供多个以供多个以“Add开头的方法可以实现追加时间的功能,这些方开头的方法可以实现追加时间的功能,这些方法的具体说明如表所示。法的具体说明如表所示。方法说明A

347、dd()将指定的TimeSpan的值加到指定的时间上。AddYears()将指定的年份数加到指定的时间上。AddMonths()将指定的月份数加到指定的时间上。AddDays()将指定的天数加到指定的时间上。AddHours()将指定的小时数加到指定的时间上。AddMinutes()将指定的分钟数加到指定的时间上。AddSeconds()将指定的秒数加到指定的时间上。AddMilliseconds()将指定的毫秒数加到指定的时间上。AddTicks()将指定的刻度数加到指定的时间上。C#从入门到实践从入门到实践20.4 20.4 实例一:计算实例一:计算forfor循环的运算时间循环的运算时间

348、【实例【实例20-1】计算】计算for循环的运算时间。该功能由循环的运算时间。该功能由ConsumeTime()方法实现。方法实现。C#从入门到实践从入门到实践20.5 20.5 小结小结本章主要介绍了本章主要介绍了C#语言中的日期和时间处理,如语言中的日期和时间处理,如DateTime结构、结构、TimeSpan结构、格式化日期和时间、计算日期和结构、格式化日期和时间、计算日期和时间差、追加日期和时间等。其中,读者要着重掌握格时间差、追加日期和时间等。其中,读者要着重掌握格式化日期和时间,以及计算日期和时间差的方法,为后式化日期和时间,以及计算日期和时间差的方法,为后续编写续编写C#程序代码

349、奠定根底。下一章将要介绍程序代码奠定根底。下一章将要介绍.NET Framework中的的中的的IO流、目录和文件处理。流、目录和文件处理。C#从入门到实践从入门到实践20.6 20.6 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_20的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2获取当前时间,并显示在控制台。获取当前时间,并显示在控制台。3计算一个计算一个for语句执行的时间。其中,该语句执行的时间。其中,该for语

350、句执行语句执行1000000次。次。C#从入门到实践从入门到实践第第2121章章 IO IO流、目录和文件处理流、目录和文件处理IO流、目录和文件处理是系统最为常见的流、目录和文件处理是系统最为常见的IO操作。操作。IO流为流为文件、输入文件、输入/输出设备、内部进程通信管道、输出设备、内部进程通信管道、TCP/IP套套接字提供了操作方法。目录处理包括创立、删除、移动、接字提供了操作方法。目录处理包括创立、删除、移动、遍历目录等操作,文件处理包括创立、写入、读取、移遍历目录等操作,文件处理包括创立、写入、读取、移动、删除文件等操作。本章将讲解动、删除文件等操作。本章将讲解IO流、目录和文件处流

351、、目录和文件处理,主要介绍以下知识点。理,主要介绍以下知识点。文件流;文件流;内存流;内存流;目录处理;目录处理;文件处理。文件处理。C#从入门到实践从入门到实践21.1 IO21.1 IO流流流是字节序列的抽象概念,如文件、输入流是字节序列的抽象概念,如文件、输入/输出设备、内部输出设备、内部进程通信管道、进程通信管道、TCP/IP套接字等。套接字等。Stream类是所有流的类是所有流的抽象基类,它可以为流提供一般性视图,从而使得开发抽象基类,它可以为流提供一般性视图,从而使得开发人员不需要了解人员不需要了解IO设备的具体细节。与流相关的操作包设备的具体细节。与流相关的操作包括以下括以下3个

352、根本操作。个根本操作。读取流,即读取流中的内容。读取流,即读取流中的内容。写入流,即将指定的内容写入到流中。写入流,即将指定的内容写入到流中。流支持查找,即可以查找或设置流的当前位置。流支持查找,即可以查找或设置流的当前位置。C#从入门到实践从入门到实践21.1.1 21.1.1 文件流文件流FileStream文件流类公开以文件为主的文件流类公开以文件为主的Stream,它既,它既支持同步读写操作,也支持异步读写操作。使用文件流支持同步读写操作,也支持异步读写操作。使用文件流可以对文件进行读取、写入、翻开和关闭操作,以及系可以对文件进行读取、写入、翻开和关闭操作,以及系统相关操作的标准输入、

353、标准输出等。统相关操作的标准输入、标准输出等。FileStream类包括类包括9个属性,它们可以描述个属性,它们可以描述FileStream类的类的实例的特性,如流的长度以字节为单位、流的当前实例的特性,如流的长度以字节为单位、流的当前位置、是否能够读或写或查询等。位置、是否能够读或写或查询等。FileStream类的属性类的属性的具体说明如表所示。的具体说明如表所示。C#从入门到实践从入门到实践21.1.2 21.1.2 内存流内存流MemoryStream类可以用来创立其支持存储区为内存的流。类可以用来创立其支持存储区为内存的流。它可以封装内存中的存储的数据,这些数据的表现形式它可以封装内

354、存中的存储的数据,这些数据的表现形式为无符号字节数组。并且,通过为无符号字节数组。并且,通过MemoryStream类的实类的实例可以直接在内存中访问该数组。特别地,使用内存流例可以直接在内存中访问该数组。特别地,使用内存流可以降低应用程序对临时缓冲区和临时文件的需要。可以降低应用程序对临时缓冲区和临时文件的需要。C#从入门到实践从入门到实践21.2 21.2 目录处理目录处理在在.NET Framework中,用来处理目录的类主要包括中,用来处理目录的类主要包括Directory和和DirectoryInfo类。类。Directory类是一个静态类,类是一个静态类,它公开用于创立、移动、枚举

355、目录和子目录的静态方法。它公开用于创立、移动、枚举目录和子目录的静态方法。DirectoryInfo类是一个密封类,从类是一个密封类,从FileSystemInfo类派生,类派生,并公开用于创立、移动、枚举目录和子目录的实例方法。并公开用于创立、移动、枚举目录和子目录的实例方法。C#从入门到实践从入门到实践21.2.1 Directory21.2.1 Directory类类Directory类是一个静态类,它只包含多个静态方法,用来创立、移类是一个静态类,它只包含多个静态方法,用来创立、移动、枚举目录和子目录。其中,常用的静态方法具体说明如表所示。动、枚举目录和子目录。其中,常用的静态方法具体

356、说明如表所示。方法说明CreateDirectory()创建指定路径的目录。Delete()删除指定的目录。Exists()判断指定路径的目录是否存在。如果存在,返回true,否则返回false。Move()将指定文件或目录及其内容移到新位置。GetParent()获取指定路径的父目录。GetCurrentDirectory()获取应用程序的当前工作目录。SetCurrentDirectory()设置应用程序的当前工作目录。GetDirectories()获取指定目录中子目录。GetDirectoryRoot()获取指定路径的卷信息或根信息。GetFiles()获取指定目录中的文件。GetFi

357、leSystemEntries()获取指定目录中所有文件和子目录。GetLogicalDrives()获取当前计算机上的逻辑驱动器。GetCreationTime()获取目录的创建日期和时间。SetCreationTime()设置指定的文件或目录的创建日期和时间。GetLastAccessTime()获取上次访问指定文件或目录的日期和时间。SetLastAccessTime()设置上次访问指定文件或目录的日期和时间。GetLastWriteTime()获取上次写入指定文件或目录的日期和时间。SetLastWriteTime()设置上次写入目录的日期和时间。C#从入门到实践从入门到实践21.2.

358、2 DirectoryInfo21.2.2 DirectoryInfo类类DirectoryInfo类是一个密封类,它可以用来创立、移动、枚举目类是一个密封类,它可以用来创立、移动、枚举目录和子目录。录和子目录。DirectoryInfo类包括类包括4个属性,可以用来获取目录的个属性,可以用来获取目录的名称、父目录等,具体说明如表所示。名称、父目录等,具体说明如表所示。属性说明Exists判断指定目录是否存在。如果存在,则返回true,否则返回false。Name获取目录的名称。Parent获取指定子目录的父目录。Root获取路径的根部分。C#从入门到实践从入门到实践21.2.3 21.2.3

359、 创立目录创立目录创立目录可以使用以下创立目录可以使用以下3种方法中的任何一种。种方法中的任何一种。Directory类的类的CreateDirectory()方法,用来创立一个目录。方法,用来创立一个目录。DirectoryInfo类的类的Create()方法,用来创立一个目录。方法,用来创立一个目录。DirectoryInfo类的类的CreateSubdirectory()方法,用来创立一方法,用来创立一个指定目录下的子目录。个指定目录下的子目录。C#从入门到实践从入门到实践21.2.4 21.2.4 删除目录删除目录删除目录可以使用以下删除目录可以使用以下2种方法中的任何一种。种方法中的

360、任何一种。Directory类的类的Delete()方法,用来删除一个目录。方法,用来删除一个目录。DirectoryInfo类的类的Delete()方法,用来删除一个目录。方法,用来删除一个目录。Directory类的类的Delete()方法存在以下两个原型。方法存在以下两个原型。public static void Delete(string path),删除,删除path指定的目录,指定的目录,且该目录必须为空目录。且该目录必须为空目录。public static void Delete(string path,bool recursive),删除,删除path指定的目录。指定的目录。r

361、ecursive参数指定是否删除该目录下参数指定是否删除该目录下的所有内容如子目录、文件等。的所有内容如子目录、文件等。C#从入门到实践从入门到实践21.2.5 21.2.5 移动目录移动目录移动目录可以使用以下移动目录可以使用以下2种方法中的任何一种。种方法中的任何一种。lDirectory类的类的Move()方法,将指定文件或目录及其内容方法,将指定文件或目录及其内容移到新位置。移到新位置。lDirectoryInfo类的类的MoveTo()方法,将指定目录及其内容方法,将指定目录及其内容移到新位置。移到新位置。C#从入门到实践从入门到实践21.2.6 21.2.6 遍历目录遍历目录遍历目

362、录是指获取该目录下的子目录或文件,主要存在一遍历目录是指获取该目录下的子目录或文件,主要存在一下下6种方法。种方法。lDirectory类的类的GetDirectories()方法,获取指定目录中子方法,获取指定目录中子目录。目录。lDirectory类的类的GetFiles()方法,获取指定目录中的文件。方法,获取指定目录中的文件。lDirectory类的类的GetFileSystemEntries()方法,获取指定目方法,获取指定目录中所有文件和子目录。录中所有文件和子目录。lDirectoryInfo类的类的GetDirectories()方法,获取当前目录方法,获取当前目录的子目录。的

363、子目录。lDirectoryInfo类的类的GetFiles()方法,获取当前目录的文件。方法,获取当前目录的文件。lDirectoryInfo类的类的GetFileSystemInfos()方法,获取当前方法,获取当前目录的所有文件和子目录。目录的所有文件和子目录。C#从入门到实践从入门到实践21.3 21.3 文件处理文件处理在在.NET Framework中,用来处理文件的类主要包括中,用来处理文件的类主要包括File和和FileInfo类。类。File类是一个静态类,它提供用于创立、复类是一个静态类,它提供用于创立、复制、删除、移动和翻开文件的静态方法。制、删除、移动和翻开文件的静态方

364、法。FileInfo类是一类是一个密封类,从个密封类,从FileSystemInfo类派生,并提供创立、复制、类派生,并提供创立、复制、删除、移动和翻开文件的实例方法。删除、移动和翻开文件的实例方法。C#从入门到实践从入门到实践21.3.1 File21.3.1 File类类File类是一个静态类,它只包含多个静态方法,用来创立、类是一个静态类,它只包含多个静态方法,用来创立、复制、删除、移动和翻开文件。复制、删除、移动和翻开文件。C#从入门到实践从入门到实践21.3.2 FileInfo21.3.2 FileInfo类类FileInfo类是一个密封类,它可以用来创立、复制、删除、移动类是一个

365、密封类,它可以用来创立、复制、删除、移动和翻开文件的实例方法。和翻开文件的实例方法。FileInfo类包括类包括6个属性,可以用来获取个属性,可以用来获取文件的名称、完整路径等,具体说明如表所示。文件的名称、完整路径等,具体说明如表所示。属性说明Directory获取父目录。DirectoryName获取文件的完整路径。IsReadOnly获取或设置当前文件是否为只读。Exists指定当前文件是否存在。Length获取当前文件的大小(字节)。Name获取文件的名称。C#从入门到实践从入门到实践21.3.3 21.3.3 创立文件创立文件创立文件可以使用创立文件可以使用File类的类的Creat

366、e()方法或者方法或者FileInfo类的类的Create()方法。方法。【例如【例如21-18】使用】使用FileInfo类的类的Create()方法创立一个名称方法创立一个名称为为“my.ini的文件。的文件。FileInfo fi = new FileInfo(my.ini);fi.Create();C#从入门到实践从入门到实践21.3.4 21.3.4 写入文件写入文件存在多种方法,可以将指定内容写入到文件,如存在多种方法,可以将指定内容写入到文件,如File类的类的OpenWrite()方法、方法、FileInfo类的类的OpenWrite()方法等。方法等。C#从入门到实践从入门到

367、实践21.3.5 21.3.5 读取文件读取文件存在多种方法,可以从指定文件中读取内容,如存在多种方法,可以从指定文件中读取内容,如File类的类的OpenRead()方法、方法、FileInfo类的类的OpenRead()方法等。方法等。【例如【例如21-20】使用】使用FileInfo类的类的OpenRead()方法从方法从my.ini文文件读取内容,并转换为一个字符串保存为件读取内容,并转换为一个字符串保存为valuer,最终,将最终,将valuer的内容显示在控制台。的内容显示在控制台。C#从入门到实践从入门到实践21.3.6 21.3.6 移动文件移动文件移动文件可以使用以下移动文件

368、可以使用以下2种方法中的任何一种。种方法中的任何一种。lFile类的类的Move()方法,将指定文件移到新位置。方法,将指定文件移到新位置。lFileInfo类的类的MoveTo()方法,将指定文件移到新位置。方法,将指定文件移到新位置。C#从入门到实践从入门到实践21.3.7 21.3.7 删除文件删除文件删除文件可以使用以下删除文件可以使用以下2种方法中的任何一种。种方法中的任何一种。lFile类的类的Delete()方法,将删除指定的文件。方法,将删除指定的文件。lFileInfo类的类的Delete()方法,将删除指定的文件。方法,将删除指定的文件。C#从入门到实践从入门到实践21.4

369、 21.4 实例:读取目录下指定类型的文件的内实例:读取目录下指定类型的文件的内容容【实例【实例21-1】实现了读取指定目录下的、指定文件类型的、】实现了读取指定目录下的、指定文件类型的、所有文件的内容,并在控制台中显示读取的内容。所有文件的内容,并在控制台中显示读取的内容。C#从入门到实践从入门到实践21.5 21.5 小结小结本章主要介绍了本章主要介绍了.NET Framework中的中的IO流、目录和文件处流、目录和文件处理,如文件流、目录流、目录处理、文件处理等。其中,理,如文件流、目录流、目录处理、文件处理等。其中,读者要着重掌握目录处理和文件处理,为后续编写对文读者要着重掌握目录处

370、理和文件处理,为后续编写对文件操作的件操作的C#应用程序代码奠定根底。下一章将要介绍应用程序代码奠定根底。下一章将要介绍C#语言的语言的Windows窗体编程。窗体编程。C#从入门到实践从入门到实践21.6 21.6 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_21的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1将名称为将名称为“class1.cs的文件添加到该应用程序中。的文件添加到该应用程序中。2在文件中是实现使用二进制方法对在文件中是实现使用二进制方法对“readme.txt文文件的读写方法。件的读写方

371、法。C#从入门到实践从入门到实践第第2222章章 Windows Windows窗体编程窗体编程Windows窗体应用程序是基于窗体应用程序是基于Microsoft Windows平台至上一种平台至上一种经典的可视化应用程序,它特别适合于包含丰富图形用户界经典的可视化应用程序,它特别适合于包含丰富图形用户界面的应用程序。面的应用程序。Windows窗体应用程序运行之后,往往会显窗体应用程序运行之后,往往会显示一个或多个的示一个或多个的Windows窗体,具有友好的交互功能。使用窗体,具有友好的交互功能。使用.NET Framework和和C#语言可以开发功能强大的语言可以开发功能强大的Wind

372、ows窗体窗体应用程序。本章节主要介绍以下知识点。应用程序。本章节主要介绍以下知识点。Windows窗体应用程序概述;窗体应用程序概述;Windows窗体根本控件;窗体根本控件;MainForm.cs窗体设计;窗体设计;菜单和工具栏;菜单和工具栏;容器;容器;对话框;对话框;数据网格视图控件;数据网格视图控件;运行运行Sample_22应用程序。应用程序。C#从入门到实践从入门到实践22.1 Windows22.1 Windows窗体应用程序概述窗体应用程序概述本节介绍使用本节介绍使用Microsoft Visual Studio 2021集成开发环境集成开发环境IDE创立创立Sample_2

373、2 Windows窗体应用程序的方法,窗体应用程序的方法,以及该以及该Windows窗体应用程序的起始点窗体应用程序的起始点Program.cs文文件、配置信息件、配置信息AssemblyInfo.cs文件等。文件等。C#从入门到实践从入门到实践22.1.1 22.1.1 创立创立Sample_22 WindowsSample_22 Windows窗体应用程窗体应用程序序依次选择依次选择“开始开始|“所有程序所有程序|“Microsoft Visual Studio 2021|“Microsoft Visual Studio 2021命令,翻开命令,翻开“起起始页始页 - Microsoft

374、Visual Studio窗口。单击窗口。单击“最近工程最近工程面板中的面板中的“创立下的创立下的“工程链接,弹出工程链接,弹出“新建工新建工程对话框,如下图。程对话框,如下图。C#从入门到实践从入门到实践22.1.2 22.1.2 应用程序起始点应用程序起始点双击双击“解决方案资源管理器面板中的解决方案资源管理器面板中的“Program.cs节节点,翻开点,翻开Program.cs文件。该文件为文件。该文件为Sample_22 Windows窗体应用程序提供主入口点。窗体应用程序提供主入口点。C#从入门到实践从入门到实践22.1.3 22.1.3 配置程序集信息配置程序集信息首先展开首先展开

375、“解决方案资源管理器面板中的解决方案资源管理器面板中的“Properties节点,然后双击节点,然后双击“AssemblyInfo.cs节点翻开节点翻开AssemblyInfo.cs文件。该文件用来配置文件。该文件用来配置Sample_22 Windows窗体应用程序的程序集信息。窗体应用程序的程序集信息。C#从入门到实践从入门到实践22.2 22.2 根本控件根本控件本小节对本小节对Windows窗体的根本控件做一个简单介绍。这些窗体的根本控件做一个简单介绍。这些根本控件包括标签控件、图片框控件、文本框控件、富根本控件包括标签控件、图片框控件、文本框控件、富文本框控件、按钮控件、单项按钮和复

376、选框。文本框控件、按钮控件、单项按钮和复选框。C#从入门到实践从入门到实践22.2.1 22.2.1 标签控件标签控件标签标签Label控件是最为简单的控件是最为简单的Windows窗体控件,它可窗体控件,它可以用来显示不能编辑的文本或图像。标签控件不能接收以用来显示不能编辑的文本或图像。标签控件不能接收焦点,但是可以作为其他控件的访问键。焦点,但是可以作为其他控件的访问键。C#从入门到实践从入门到实践22.2.2 22.2.2 图片框控件图片框控件图片框图片框PictureBox控件可以用来显示位图、控件可以用来显示位图、GIF、JPEG、图元文件或图标格式的图形,它显示的图片由、图元文件或

377、图标格式的图形,它显示的图片由Image属性指定,也可以由属性指定,也可以由ImageLocation属性指定被显属性指定被显示图片的地址在显示指定的图片时,由示图片的地址在显示指定的图片时,由Load()方法实方法实现。现。C#从入门到实践从入门到实践22.2.3 22.2.3 文本框和富文本框文本框和富文本框文本框文本框TextBox控件可以用来获取用户输入或显示文本。控件可以用来获取用户输入或显示文本。文本框可以用来编辑文本,也可以以只读方式显示文本。文本框可以用来编辑文本,也可以以只读方式显示文本。文本框通常显示为单行,但也可以显示多个行。通过文本框通常显示为单行,但也可以显示多个行。

378、通过Text属性可以获取或设置文本框的输入或显示的文本。属性可以获取或设置文本框的输入或显示的文本。富文本框富文本框RichTextBox控件和文本框相比,它能够处理控件和文本框相比,它能够处理有格式的文本,还可以显示字体、颜色、链接、嵌入的有格式的文本,还可以显示字体、颜色、链接、嵌入的图像等。实际上,富文本框能够提供类似字处理应用程图像等。实际上,富文本框能够提供类似字处理应用程序的文本操作和显示功能,如复制、剪切、粘贴、全选序的文本操作和显示功能,如复制、剪切、粘贴、全选等。等。C#从入门到实践从入门到实践22.2.4 22.2.4 按钮控件按钮控件按钮按钮Button控件允许用户通过单

379、击来执行操作。每当控件允许用户通过单击来执行操作。每当用户单击按钮时,即调用该按钮事先定义的用户单击按钮时,即调用该按钮事先定义的Click事件处事件处理程序。按钮显示的文本可以通过其理程序。按钮显示的文本可以通过其Text属性指定,另属性指定,另外,按钮还可以使用外,按钮还可以使用Image或者或者ImageList属性显示图像。属性显示图像。C#从入门到实践从入门到实践22.2.5 22.2.5 单项按钮和复选框单项按钮和复选框单项按钮由单项按钮由RadioButton类实现,可以为用户提供由两个或类实现,可以为用户提供由两个或多个互斥选项组成的选项集。多个单项选择框可以组合多个互斥选项组

380、成的选项集。多个单项选择框可以组合为一个组。对于同一组内的所有单项按钮而言,用户一为一个组。对于同一组内的所有单项按钮而言,用户一次只能选中一个单项按钮。复选框由次只能选中一个单项按钮。复选框由CheckBox类实现,类实现,它可以用来指定某个条件是翻开的还是关闭的,即常常它可以用来指定某个条件是翻开的还是关闭的,即常常用来提供用来提供“是是/否或者否或者“真真/假选项。多个复选框也假选项。多个复选框也可以组合为一个组,用户可以选择该组中的一个或多个可以组合为一个组,用户可以选择该组中的一个或多个复选框。复选框。C#从入门到实践从入门到实践22.3 MainForm.cs22.3 MainFo

381、rm.cs窗体设计窗体设计本小节介绍设计本小节介绍设计MainForm.cs窗体的方法,包括配置窗体窗体的方法,包括配置窗体的属性如名称、标题等、添加控件如标签控件、的属性如名称、标题等、添加控件如标签控件、按钮控件、图片框控件等、创立新窗口如等待对话按钮控件、图片框控件等、创立新窗口如等待对话框等等方法。框等等方法。C#从入门到实践从入门到实践22.3.1 22.3.1 配置窗体属性配置窗体属性翻开翻开“解决方案资源管理器面板,并将解决方案资源管理器面板,并将“Form1.cs节点重命名为节点重命名为“MainForm.cs节点。双击该节点翻开节点。双击该节点翻开MainForm.cs窗体的

382、设计界面。单击窗体的设计界面。单击MainForm.cs窗体,窗体,“属性面板将显示属性面板将显示该窗体的各种属性及其值。开发人员还可该窗体的各种属性及其值。开发人员还可以通过以通过“属性面板配置该窗体的各种属属性面板配置该窗体的各种属性。在此,笔者将性。在此,笔者将MainForm.cs窗体的窗体的Name属性的值设置为属性的值设置为“MainForm、Text属性的值设置为属性的值设置为“Windows窗体编程窗体编程,如下图。,如下图。C#从入门到实践从入门到实践22.3.2 22.3.2 添加控件添加控件选择选择“工具箱中的某一个控件,并直接拖放到工具箱中的某一个控件,并直接拖放到Ma

383、inForm.cs窗体之上,就可以把该控件添加到窗体之上,就可以把该控件添加到MainForm.cs窗体。在此,笔者向窗体。在此,笔者向MainForm.cs窗体添窗体添加了多个控件,并设置了相应的事件。加了多个控件,并设置了相应的事件。C#从入门到实践从入门到实践22.3.3 22.3.3 创立等待对话框创立等待对话框下面介绍创立等待对话框由下面介绍创立等待对话框由WaittingForm.cs窗体实现窗体实现的具体步骤。的具体步骤。C#从入门到实践从入门到实践22.3.4 22.3.4 添加窗体事件添加窗体事件翻开翻开MainForm.cs窗体的设计界面,并双击该窗体就可以窗体的设计界面,

384、并双击该窗体就可以为该窗体添加为该窗体添加MainForm_Load(object sender, EventArgs e)事件。当系统加载事件。当系统加载MainForm.cs窗体时,将触发该事窗体时,将触发该事件。件。C#从入门到实践从入门到实践22.4 22.4 菜单和工具栏菜单和工具栏本小节介绍本小节介绍Windwos系统中最为熟悉的系统中最为熟悉的3个控件:菜单由个控件:菜单由MenuStrip类实现、工具栏由类实现、工具栏由ToolStrip类实现和类实现和上下文菜单由上下文菜单由ContextMenuStrip类实现的使用方法。类实现的使用方法。C#从入门到实践从入门到实践22.

385、4.1 22.4.1 菜单菜单菜单由菜单由MenuStrip类实现,它可以通过存放按照一般主题分类实现,它可以通过存放按照一般主题分组的命令将功能公开给用户。使用菜单可以轻松实现以组的命令将功能公开给用户。使用菜单可以轻松实现以下下3个功能。个功能。创立支持高级用户界面和布局功能的易自定义的常用菜单。创立支持高级用户界面和布局功能的易自定义的常用菜单。支持操作系统的典型外观和行为。支持操作系统的典型外观和行为。对所有容器和包含的项进行事件的一致性处理。对所有容器和包含的项进行事件的一致性处理。C#从入门到实践从入门到实践22.4.2 22.4.2 工具栏工具栏工具栏由工具栏由ToolStrip

386、类型实现,它可以为类型实现,它可以为Windows窗体实现窗体实现工具栏的功能。并且,还可以向工具栏添加按钮、下拉工具栏的功能。并且,还可以向工具栏添加按钮、下拉按钮、分割栏、文本框、下拉列表等控件。按钮、分割栏、文本框、下拉列表等控件。C#从入门到实践从入门到实践22.4.3 22.4.3 上下文菜单上下文菜单上下文菜单由上下文菜单由ContextMenuStrip类型实现。当用户单击鼠类型实现。当用户单击鼠标右键时,将在鼠标位置显示上下文菜单。如果要为某标右键时,将在鼠标位置显示上下文菜单。如果要为某一个窗体添加上下文菜单,只要将上下文菜单一个窗体添加上下文菜单,只要将上下文菜单ToolS

387、trip控件从控件从“工具箱面板中直接拖放到窗体上工具箱面板中直接拖放到窗体上即可。即可。C#从入门到实践从入门到实践22.5 22.5 容器容器本小节主要介绍本小节主要介绍Windwos系统中最为熟悉的系统中最为熟悉的3个容器控件:个容器控件:面板由面板由Panel类实现、组合框由类实现、组合框由GroupBox类实现类实现和选项卡由和选项卡由TabControl和和TabPage类实现的使用类实现的使用方法。方法。C#从入门到实践从入门到实践22.5.1 22.5.1 面板面板面板面板Panel控件是一个容器控件,可以用来包含其他控控件是一个容器控件,可以用来包含其他控件,即可以使用面板控

388、件来组合控件的集合。默认情况件,即可以使用面板控件来组合控件的集合。默认情况下,面板控件不显示任何边框。如果要显示边框,那么下,面板控件不显示任何边框。如果要显示边框,那么需要设置其需要设置其BorderStyle属性的值。特别地,面板控件不属性的值。特别地,面板控件不显示标题。面板控件包括以下显示标题。面板控件包括以下3个常用属性。个常用属性。AutoSizeMode属性,指定控件的自动调整大小行为。属性,指定控件的自动调整大小行为。BorderStyle属性,指定控件的边框样式。属性,指定控件的边框样式。 TabStop属性,指定用户能否使用属性,指定用户能否使用Tab键将焦点放到该控件键

389、将焦点放到该控件上。上。C#从入门到实践从入门到实践22.5.2 22.5.2 组合框组合框组合框组合框GroupBox控件和面板控件比较相似,也可以用在其他控件控件和面板控件比较相似,也可以用在其他控件的容器控件。它可以显示围绕一组具有可选标题的控件的框架,并的容器控件。它可以显示围绕一组具有可选标题的控件的框架,并且还可以显示标题。组合框控件最典型的用途是用作一组单项按钮且还可以显示标题。组合框控件最典型的用途是用作一组单项按钮的容器,并指定为以一个逻辑组,组内的单项按钮互相排斥。组合的容器,并指定为以一个逻辑组,组内的单项按钮互相排斥。组合框控件包括以下框控件包括以下8个常用属性。个常用

390、属性。AllowDrop属性,指定控件是否允许使用拖放操作和事件。属性,指定控件是否允许使用拖放操作和事件。AutoSize属性,指定控件是否根据其内容调整大小。属性,指定控件是否根据其内容调整大小。AutoSizeMode属性,当控件启用属性,当控件启用AutoSize属性时,指定控件的行为方式。属性时,指定控件的行为方式。DisplayRectangle属性,获取控件的维度的矩形。属性,获取控件的维度的矩形。FlatStyle属性,获取或设置控件的平面样式外观。属性,获取或设置控件的平面样式外观。TabStop属性,指定用户能否使用属性,指定用户能否使用Tab键将焦点放到该控件上。键将焦点

391、放到该控件上。Text属性,控件的标题。属性,控件的标题。UseCompatibleTextRendering属性,指定是否使用了兼容文本呈现控件属性,指定是否使用了兼容文本呈现控件的标题。的标题。C#从入门到实践从入门到实践22.5.3 TabControl22.5.3 TabControl控件控件TabControl控件可以显示多个选项卡,每一个选项卡都包控件可以显示多个选项卡,每一个选项卡都包含一个选项卡页含一个选项卡页TabPage控件,而且每一个选项卡控件,而且每一个选项卡页可以包含其他控件。单击每一个选项卡的标题可以设页可以包含其他控件。单击每一个选项卡的标题可以设置它的选项卡页为

392、当前选项卡页。选项卡是置它的选项卡页为当前选项卡页。选项卡是TabControl控件的一局部,但不是各个选项卡页的一局部。选项卡控件的一局部,但不是各个选项卡页的一局部。选项卡页控件的属性只影响选项卡页的矩形工作区,而不影响页控件的属性只影响选项卡页的矩形工作区,而不影响选项卡。选项卡。TabControl控件包括以下控件包括以下3个常用属性。个常用属性。SelectedIndex属性,当前选定的选项卡页的索引。属性,当前选定的选项卡页的索引。 SelectedTab属性,当前选定的选项卡页。属性,当前选定的选项卡页。TabPages属性,属性,TabControl控件中选项卡页的集合。控件中

393、选项卡页的集合。C#从入门到实践从入门到实践22.5.4 22.5.4 容器窗体容器窗体容器窗体由容器窗体由ContainForm.cs窗体实现,介绍了面板、组合窗体实现,介绍了面板、组合框、选项卡等控件的使用方法。该窗体的标题为框、选项卡等控件的使用方法。该窗体的标题为“容器容器,它包括,它包括1个个TabControl控件、控件、3个个Tabpage、1个个TextBox控件、控件、1个个RichTextBox控件、控件、1个个PictureBox、1个个GroupBox、3个个RadioButton和和2个个Panel控件。控件。C#从入门到实践从入门到实践22.6 22.6 对话框对话

394、框对话框对话框Dialog是一种特殊的窗体其是一种特殊的窗体其FormBorderStyle属性的值为属性的值为FormBorderStyle.FixedDialog,常常用于,常常用于与用户交互和检索信息。本小节介绍与用户交互和检索信息。本小节介绍Windows应用程序应用程序最为常用的最为常用的5种对话框:颜色对话框、字体对话框、翻种对话框:颜色对话框、字体对话框、翻开文件对话框、保存文件对话框和目录浏览对话框。开文件对话框、保存文件对话框和目录浏览对话框。C#从入门到实践从入门到实践22.6.1 22.6.1 对话框窗体对话框窗体对话框窗体由对话框窗体由DialogForm.cs窗体实现

395、。用户单击该对话框窗体实现。用户单击该对话框中的中的“设置颜色、设置颜色、“设置字体、设置字体、“浏览文件浏览文件、“保存为保存为和和“浏览目录浏览目录按钮分别弹出颜色对话按钮分别弹出颜色对话框、字体对话框、翻开文件对话框、保存文件对话框和框、字体对话框、翻开文件对话框、保存文件对话框和目录浏览对话框。目录浏览对话框。C#从入门到实践从入门到实践22.6.2 22.6.2 颜色对话框颜色对话框颜色对话框由颜色对话框由Windows窗体窗体ColorDialog组件实现,它是一组件实现,它是一个预先设置的对话框。用户可以从该对话框的调色板中个预先设置的对话框。用户可以从该对话框的调色板中选择颜色

396、,以及将自定义颜色添加到该调色板。如果开选择颜色,以及将自定义颜色添加到该调色板。如果开发基于发基于Windows的应用程序,开发人员可以使用该对话的应用程序,开发人员可以使用该对话框来实现选择颜色功能,而不需要再配置自己的对话框。框来实现选择颜色功能,而不需要再配置自己的对话框。颜色对话框包括颜色对话框包括7个常用属性,如获取颜色对话框中选择的个常用属性,如获取颜色对话框中选择的颜色的颜色的Color属性、禁用属性、禁用“定义自定义颜色按钮的定义自定义颜色按钮的AllowFullOpen属性等。属性等。C#从入门到实践从入门到实践22.6.3 22.6.3 字体对话框字体对话框字体对话框由字

397、体对话框由Windows窗体窗体ColorDialog组件实现,它也是一个预组件实现,它也是一个预先设置的对话框。用户可以从该对话框中选择系统上当前安装的字先设置的对话框。用户可以从该对话框中选择系统上当前安装的字体。通过该对话框,用户可以设置文本的字体、样式、大小、脚本体。通过该对话框,用户可以设置文本的字体、样式、大小、脚本和效果。字体对话框包括和效果。字体对话框包括5个常用属性,具体说明如表所示。个常用属性,具体说明如表所示。属性描述Font用户选定的字体。Color用户选定的字体颜色。MaxSize用户可选择的最大磅值。MinSize用户可选择的最小磅值。ShowHelp指示是否显示“

398、帮助”按钮。C#从入门到实践从入门到实践22.6.4 22.6.4 翻开文件对话框翻开文件对话框翻开文件对话框由翻开文件对话框由Windows窗体窗体OpenFileDialog组件实现,它与组件实现,它与Windows操作系统所公开的操作系统所公开的“翻开文件对话框相同。翻开文件翻开文件对话框相同。翻开文件对话框包括对话框包括5个常用属性,具体说明如表所示。个常用属性,具体说明如表所示。属性描述Multiselect是否允许选择多个文件。ReadOnlyChecked是否选定只读复选框。SafeFileName所选文件的文件名和扩展名。SafeFileNames所有选定文件的文件名和扩展名的

399、数组。ShowReadOnly是否包含只读复选框。C#从入门到实践从入门到实践22.6.5 22.6.5 保存文件对话框保存文件对话框保存文件对话框由保存文件对话框由Windows窗体窗体SaveFileDialog组件实现,它组件实现,它与与Windows使用的标准使用的标准“保存文件对话框相同。保存文件对保存文件对话框相同。保存文件对话框包括话框包括2个常用属性,具体说明如表所示。个常用属性,具体说明如表所示。属性描述CreatePrompt如果用户指定不存在的文件,对话框是否提示用户允许创建该文件。OverwritePrompt如果用户指定的文件名已存在,保存文件对话框是否显示警告。C#

400、从入门到实践从入门到实践22.6.6 22.6.6 目录浏览对话框目录浏览对话框目录浏览对话框由目录浏览对话框由Windows窗体窗体FolderBrowserDialog组件实现,它组件实现,它可以显示一个用于浏览和选择文件夹的模式对话框。用户可以从该可以显示一个用于浏览和选择文件夹的模式对话框。用户可以从该对话框中选择文件夹。目录浏览对话框包括对话框中选择文件夹。目录浏览对话框包括4个常用属性,如获取个常用属性,如获取用户所选择文件夹的路径的用户所选择文件夹的路径的SelectedPath属性、启用属性、启用“新建文件夹新建文件夹按钮的按钮的ShowNewFolderButton属性等。这

401、些常用属性的具体说明属性等。这些常用属性的具体说明如表所示。如表所示。属性描述SelectedPath用户选定的路径。ShowNewFolderButton指示是否显示“新建文件夹”按钮。Description对话框中在树视图控件上显示的说明文本。RootFolder从其开始浏览的根文件夹。C#从入门到实践从入门到实践22.7 22.7 数据网格视图控件数据网格视图控件数据网格视图控件窗体由数据网格视图控件窗体由DGVForm.cs窗体实现,该窗体使窗体实现,该窗体使用用DataGridView数据网格视图控件显示数据。数据网格视图控件显示数据。DGVForm.cs窗体的标题为窗体的标题为“数

402、据网格视图控件,它数据网格视图控件,它只包含只包含1个个DataGridView控件控件Name属性的值为属性的值为dgvData。运行运行Sample_22 Windows窗体应用程序之后,单击窗体应用程序之后,单击“数据数据网格视图命令翻开网格视图命令翻开“数据网格视图控件对话框数据网格视图控件对话框DGVForm.cs窗体,如下图。窗体,如下图。C#从入门到实践从入门到实践22.8 22.8 运行应用程序运行应用程序按下按下“F5按钮或者单击按钮或者单击Microsoft Visual Studio 2021集成集成开发环境中的按钮即可运行开发环境中的按钮即可运行Sample_22 Wi

403、ndows窗体应窗体应用程序。该应用程序运行之后,显示的第一个窗口为用程序。该应用程序运行之后,显示的第一个窗口为“Form1窗口,如下图。窗口,如下图。C#从入门到实践从入门到实践22.9 22.9 小结小结本章主要介绍了本章主要介绍了Windows窗体应用程序,如窗体应用程序,如Windows窗体窗体应用程序概述、应用程序概述、Windows窗体根本控件、窗体根本控件、MainForm.cs窗体设计、菜单和工具栏、容器、对话框、数据网格视窗体设计、菜单和工具栏、容器、对话框、数据网格视图控件等。其中,读者要着重掌握图控件等。其中,读者要着重掌握Windows窗体根本控窗体根本控件、菜单、工

404、具栏、容器、对话框和数据网格视图控件件、菜单、工具栏、容器、对话框和数据网格视图控件的使用方法,为后续编写功能强大的的使用方法,为后续编写功能强大的Windows应用程序应用程序奠定根底。下一章将要介绍奠定根底。下一章将要介绍.NET Framework中的中的GDI+绘图技术。绘图技术。C#从入门到实践从入门到实践22.10 22.10 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_22的的Windows应用程序,并实现等待对话框的功能。应用程序,并实现等待对话框的功能。C#从入门到实践从入门到实践第第2323章章 使用使用GDI

405、+GDI+绘图绘图GDI+是是.NET Framework中专门用于绘制线条和形状、呈中专门用于绘制线条和形状、呈现文本或显示与操作图像的技术。现文本或显示与操作图像的技术。Graphics类封装一个类封装一个GDI+绘图图面,绘图图面,Graphics对象和点、区域、颜色、刷、对象和点、区域、颜色、刷、画笔、字体等结构或类提供将对象绘制到显示设备的方画笔、字体等结构或类提供将对象绘制到显示设备的方法。本章节主要介绍以下知识点。法。本章节主要介绍以下知识点。lGraphics类;类;l点、区域、颜色、刷、画笔和字体;点、区域、颜色、刷、画笔和字体;l绘制直线、虚线和曲线;绘制直线、虚线和曲线;

406、l绘制多边形和椭圆;绘制多边形和椭圆;l绘制饼状图;绘制饼状图;l绘制文本。绘制文本。C#从入门到实践从入门到实践23.1 GDI+23.1 GDI+概述概述GDI+是是Windows XP操作系统中提供二维矢量图形、图像操作系统中提供二维矢量图形、图像处理和版式的局部。处理和版式的局部。.NET Framework为操作图形提供了为操作图形提供了GDI+应用程序编程接口,应用程序编程接口,GDI+是是 Windows图形设备接图形设备接口口GDI的高级实现,通过使用的高级实现,通过使用GDI+,开发人员可以,开发人员可以创立图形、绘制文本,以及以对象的方式来操作图形或创立图形、绘制文本,以及

407、以对象的方式来操作图形或图像。图像。C#从入门到实践从入门到实践23.1.1 Graphics23.1.1 Graphics类类Graphics类封装一个类封装一个GDI+绘图图面,提供将对象绘制到显绘图图面,提供将对象绘制到显示设备的方法,是可以用来创立图形图像的对象。通常,示设备的方法,是可以用来创立图形图像的对象。通常,Graphics对象与特定的设备上下文关联。对象与特定的设备上下文关联。1创立创立Graphics对象对象2绘制图形、文本或图像绘制图形、文本或图像3填充图形或图像填充图形或图像C#从入门到实践从入门到实践23.1.2 23.1.2 点和区域点和区域在在GDI+中,二维图

408、像都基于一个二维平面中,并使用点、中,二维图像都基于一个二维平面中,并使用点、矩形、区域来描述这些图像。这个二维平面的坐标系如矩形、区域来描述这些图像。这个二维平面的坐标系如下图。平面的左上角为坐标系的原点,水平朝右的方向下图。平面的左上角为坐标系的原点,水平朝右的方向表示表示X轴的正方向,垂直朝下的方向表示轴的正方向,垂直朝下的方向表示Y轴的正方向。轴的正方向。1Point和和PointF结构结构2Rectangle和和RectangleF结构结构3Size和和SizeF结构结构4Region类类C#从入门到实践从入门到实践23.1.3 23.1.3 颜色颜色Color颜色结构表示一种颜色结

409、构表示一种ARGB颜色,它由颜色,它由4个分量值个分量值alpha、红色、绿色和蓝色组成。、红色、绿色和蓝色组成。Color结构包括多结构包括多个方法,如用来创立颜色的个方法,如用来创立颜色的FromArgb()方法、方法、FromKnownColor()方法、方法、FromName()方法等。方法等。C#从入门到实践从入门到实践23.1.4 23.1.4 刷刷Brush刷类定义用于填充图形形状如矩形、椭圆、饼刷类定义用于填充图形形状如矩形、椭圆、饼形、多边形和封闭路径的内部的对象。形、多边形和封闭路径的内部的对象。注意:注意:Brush类是一个抽象基类,不能进行实例化。假设要类是一个抽象基类

410、,不能进行实例化。假设要创立一个刷的实例,必须使用从创立一个刷的实例,必须使用从Brush派生出的类,如派生出的类,如SolidBrush、TextureBrush、LinearGradientBrush类等。类等。C#从入门到实践从入门到实践23.1.5 23.1.5 画笔画笔Pen画笔类定义用于绘制直线和曲线的对象,还可以指画笔类定义用于绘制直线和曲线的对象,还可以指定直线的宽度、样式等。要创立一个画笔可以使用定直线的宽度、样式等。要创立一个画笔可以使用Pen类的构造函数。类的构造函数。Pen类包括类包括4个构造函数,具体说明如下。个构造函数,具体说明如下。public Pen(Brush

411、 brush),使用刷创立画笔。,使用刷创立画笔。brush参数指参数指定画笔所使用的刷。定画笔所使用的刷。public Pen(Color color),使用颜色创立画笔。,使用颜色创立画笔。color参数指参数指定画笔所使用的颜色。定画笔所使用的颜色。public Pen(Brush brush,float width),使用刷创立画笔。,使用刷创立画笔。brush参数指定画笔所使用的刷,参数指定画笔所使用的刷,width参数指定画笔的参数指定画笔的宽度。宽度。public Pen(Color color,float width),使用颜色创立画笔。,使用颜色创立画笔。color参数指定画

412、笔所使用的颜色,参数指定画笔所使用的颜色,width参数指定画笔参数指定画笔的宽度。的宽度。C#从入门到实践从入门到实践23.1.6 23.1.6 字体字体Font字体类定义特定的文本格式,包括字体、字号和字体类定义特定的文本格式,包括字体、字号和字形属性。创立字体可以使用字形属性。创立字体可以使用Font类的构造函数。类的构造函数。C#从入门到实践从入门到实践23.2 23.2 实例一:使用实例一:使用GDI+GDI+绘制线条、形状和文绘制线条、形状和文本本【实例【实例23-1】使用】使用GDI+中的中的Graphics对象对象在对象对象在Panel控件控件上绘制直线、折线、曲线、虚线、矩形

413、、三角形、多边上绘制直线、折线、曲线、虚线、矩形、三角形、多边形、椭圆、饼状图和文本。下面介绍具体实现方法。形、椭圆、饼状图和文本。下面介绍具体实现方法。C#从入门到实践从入门到实践23.2.1 23.2.1 创立创立Sample_23Sample_23窗体应用程序窗体应用程序【实例【实例23-1】创立了名称为】创立了名称为“Sample_23的的Windows Form应用程序。应用程序。C#从入门到实践从入门到实践23.2.2 Paint23.2.2 Paint事件事件当重绘当重绘Panel控件时,会触发控件时,会触发Paint事件。该事件由事件。该事件由Control类控件的基类提供,类

414、控件的基类提供,Panel类继承该事件。在类继承该事件。在Sample_23窗体应用程序中,笔者为窗体应用程序中,笔者为pChart控件添加了控件添加了Paint事件,并在该事件中为事件,并在该事件中为pChart控件的顶部绘制了控件的顶部绘制了3D边界。该事件的名称为边界。该事件的名称为pChart_Paint(object sender,PaintEventArgs e)。C#从入门到实践从入门到实践23.2.3 23.2.3 绘制直线绘制直线单击单击MainForm窗体中的窗体中的“绘制直线按钮可以在绘制直线按钮可以在pChart控件中绘制一条直线。该功能由控件中绘制一条直线。该功能由“

415、绘制直线按钮的绘制直线按钮的Click事件事件btnDrawLine_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.4 23.2.4 绘制折线绘制折线单击单击MainForm窗体中的窗体中的“绘制折线按钮可以在绘制折线按钮可以在pChart控件中绘制一条折线。该功能由控件中绘制一条折线。该功能由“绘制折线按钮的绘制折线按钮的Click事件事件btnDrawLines_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.5 23.2.5 绘制曲线绘制曲线单击单击Mai

416、nForm窗体中的窗体中的“绘制曲线按钮可以在绘制曲线按钮可以在pChart控件中绘制一条曲线。该功能由控件中绘制一条曲线。该功能由“绘制曲线按钮的绘制曲线按钮的Click事件事件btnDrawCurve_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.6 23.2.6 绘制虚线绘制虚线单击单击MainForm窗体中的窗体中的“绘制虚线按钮可以在绘制虚线按钮可以在pChart控件中绘制一条虚线。该功能由控件中绘制一条虚线。该功能由“绘制虚线按钮的绘制虚线按钮的Click事件事件btnDrawDashLine_Click(obje

417、ct sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.7 23.2.7 绘制矩形绘制矩形单击单击MainForm窗体中的窗体中的“绘制矩形按钮可以在绘制矩形按钮可以在pChart控件中绘制一个矩形。该功能由控件中绘制一个矩形。该功能由“绘制矩形按钮的绘制矩形按钮的Click事件事件btnDrawRect_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.8 23.2.8 绘制三角形绘制三角形单击单击MainForm窗体中的窗体中的“绘制三角形按钮可以在绘制三角形按钮可以在pChart控件中绘

418、制一个三角形。该功能由控件中绘制一个三角形。该功能由“绘制三角形绘制三角形按钮的按钮的Click事件事件btnDrawTriangle_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.9 23.2.9 绘制多边形绘制多边形单击单击MainForm窗体中的窗体中的“绘制多边形按钮可以在绘制多边形按钮可以在pChart控件中绘制一个多边形。该功能由控件中绘制一个多边形。该功能由“绘制多边形绘制多边形按钮的按钮的Click事件事件btnDrawPolygon_Click(object sender,EventArgs e)实现。实现。

419、C#从入门到实践从入门到实践23.2.10 23.2.10 绘制椭圆绘制椭圆单击单击MainForm窗体中的窗体中的“绘制椭圆按钮可以在绘制椭圆按钮可以在pChart控件中绘制一个椭圆。该功能由控件中绘制一个椭圆。该功能由“绘制椭圆按钮的绘制椭圆按钮的Click事件事件btnDrawEllipse_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.11 23.2.11 绘制饼状图绘制饼状图单击单击MainForm窗体中的窗体中的“绘制饼状图按钮可以在绘制饼状图按钮可以在pChart控件中绘制一个饼状图。该功能由控件中绘制一个饼状图

420、。该功能由“绘制饼状图绘制饼状图按钮的按钮的Click事件事件btnDrawPie_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.2.12 23.2.12 绘制文本绘制文本单击单击MainForm窗体中的窗体中的“绘制文本按钮可以在绘制文本按钮可以在pChart控件中绘制一段文本控件中绘制一段文本“这是一段文本。该功能由这是一段文本。该功能由“绘制文本按钮的绘制文本按钮的Click事件事件btnDrawString_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践23.3 2

421、3.3 小结小结本章主要介绍了本章主要介绍了NET Framework中的中的GDI+绘制技术,如绘制技术,如Graphics类、区域、颜色、刷、画笔、字体等,以及绘类、区域、颜色、刷、画笔、字体等,以及绘制直线、虚线、曲线、多边形、椭圆、饼状图和文本。制直线、虚线、曲线、多边形、椭圆、饼状图和文本。其中,读者要着重掌握使用其中,读者要着重掌握使用GDI+绘制直线、虚线、曲线、绘制直线、虚线、曲线、多边形、椭圆、饼状图和文本的方法,为后续编写功能多边形、椭圆、饼状图和文本的方法,为后续编写功能强大的强大的Windows应用程序奠定根底。下一章将要介绍应用程序奠定根底。下一章将要介绍.NET F

422、ramework中的数据访问。中的数据访问。C#从入门到实践从入门到实践23.4 23.4 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_23的控制台应用程序,并实现以下功能。的控制台应用程序,并实现以下功能。1创立名称为创立名称为“MyForm.cs的窗体。的窗体。2在在名称为在在名称为“MyForm.cs窗体上绘制以以下图形。窗体上绘制以以下图形。直线;直线;折线;折线;曲线;曲线;虚线;虚线;矩形;矩形;三角形;三角形;多边形;多边形;椭圆;椭圆;圆;圆;扇形;扇形;饼状图;饼状图;文本。文本。C#从入门到实践从入门到实践第第

423、2424章章 .NET .NET数据访问数据访问.NET数据访问是数据访问是.NET Framework中很重要的一个功能,它中很重要的一个功能,它由实现。通过,开发人员可以访问由实现。通过,开发人员可以访问Microsoft SQL Server、ODBC、Oracle、OLE DB、XML等数据源,并检索、等数据源,并检索、操作和更新这些数据源中的数据。本章节主要介绍以下操作和更新这些数据源中的数据。本章节主要介绍以下知识点。知识点。组成结构;组成结构;根本对象,如根本对象,如SqlCommand、SqlDataReader、SqlDataAdpater、DataSet等对象;等对象;使用

424、操作使用操作SQL Server数据库,包括连接、读取、插入、修数据库,包括连接、读取、插入、修改、删除等操作;改、删除等操作;使用使用DataGridView控件显示数据;控件显示数据;使用使用ListView控件显示数据;控件显示数据;使用使用TreeView控件显示数据。控件显示数据。C#从入门到实践从入门到实践概述概述是是.NET Framework中提供了专门用来处理数据的技术。通中提供了专门用来处理数据的技术。通过该技术,开发人员可以访问过该技术,开发人员可以访问SQL Server、ODBC、Oracle、OLE DB、XML等数据源,并检索、操作和更等数据源,并检索、操作和更新

425、这些数据源中的数据。新这些数据源中的数据。C#从入门到实践从入门到实践组成结构组成结构是是.NET Framework中的一局部,它提供对中的一局部,它提供对Microsoft SQL Server、ODBC、Oracle等数据源,以及通过等数据源,以及通过OLE DB和和XML公开的数据源的一致访问。应用程序公开的数据源的一致访问。应用程序Windows Form、等可以使用来连接到这些数据源,并检索、操、等可以使用来连接到这些数据源,并检索、操作和更新其中的数据。组成结构如下图。作和更新其中的数据。组成结构如下图。1.NET Framework数据提供程序数据提供程序2DataSet数据集

426、数据集C#从入门到实践从入门到实践根本对象根本对象根本对象主要包括根本对象主要包括Connection、Command、DataReader、DataAdapter、DataSet、DataView等对象。本小节只介等对象。本小节只介绍用于操作绍用于操作SQL Server数据库相关的数据库相关的SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter、DataSet、DataView等。等。1SqlConnection对象对象2SqlCommand对象对象3SqlDataReader对象对象4DataSet对象对象C#从入门到实践从入门到实践

427、24.2 24.2 实例一:操作实例一:操作SQL ServerSQL Server数据库数据库【实例【实例24-1】使用实现了操作】使用实现了操作SQL Server 2005数据库的功数据库的功能,包括连接数据库、读取数据、插入数据、修改数据、能,包括连接数据库、读取数据、插入数据、修改数据、删除数据、使用删除数据、使用DataGirdView控件显示数据、使用控件显示数据、使用ListView控件显示数据和使用控件显示数据和使用TreeView控件显示数据。控件显示数据。C#从入门到实践从入门到实践24.2.1 24.2.1 创立创立Sample_24Sample_24窗体应用程序窗体应

428、用程序【实例【实例24-1】创立了名称为】创立了名称为“Sample_24的的Windows Form应用程序。应用程序。C#从入门到实践从入门到实践24.2.2 24.2.2 创立创立CSharp3DBCSharp3DB数据库数据库Sample_24 Windows Form应用程序连接了名称为应用程序连接了名称为“CSharp3DB的的SQL Server 2005数据库,并操作了该数据库,并操作了该数据库中的数据。数据库中的数据。C#从入门到实践从入门到实践24.2.3 24.2.3 连接数据库连接数据库单击单击MainForm窗体中的窗体中的“连接数据库按钮可以连接连接数据库按钮可以连

429、接CSharp3DB数据库。该功能由数据库。该功能由“连接数据库按钮的连接数据库按钮的Click事件事件btnConnect_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践24.2.4 24.2.4 读取数据读取数据单击单击MainForm窗体中的窗体中的“读取数据按钮可以读取读取数据按钮可以读取CSharp3DB数据库的数据库的Data表中的所有数据,并显示在表中的所有数据,并显示在rtbMessage控件中。该功能由控件中。该功能由“读取数据按钮的读取数据按钮的Click事件事件btnReadData_Click(object se

430、nder,EventArgs e)实现。实现。C#从入门到实践从入门到实践24.2.5 24.2.5 插入数据插入数据单击单击MainForm窗体中的窗体中的“插入数据按钮可以向插入数据按钮可以向CSharp3DB数据库的数据库的Data表中插入新的数据。该功能由表中插入新的数据。该功能由“插入数据按钮的插入数据按钮的Click事件事件btnInsertData_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践24.2.6 24.2.6 修改数据修改数据单击单击MainForm窗体中的窗体中的“修改数据按钮可以修改修改数据按钮可以修改CS

431、harp3DB数据库的数据库的Data表中的数据。该功能由表中的数据。该功能由“修改修改数据按钮的数据按钮的Click事件事件btnUpdateData_Click(object sender,EventArgs e)实现。实现。C#从入门到实践从入门到实践24.2.7 24.2.7 删除数据删除数据单击单击MainForm窗体中的窗体中的“删除数据按钮可以删除删除数据按钮可以删除CSharp3DB数据库的数据库的Data表中的数据。该功能由表中的数据。该功能由“删除删除数据按钮的数据按钮的Click事件事件btnDeleteData_Click(object sender,EventArgs

432、 e)实现。实现。C#从入门到实践从入门到实践24.2.8 24.2.8 使用使用DataGridViewDataGridView控件显示数据控件显示数据单击单击MainForm窗体中的窗体中的“显示数据按钮可以在显示数据按钮可以在DataGridView控件中显示控件中显示CSharp3DB数据库的数据库的Data表表中的数据。该功能由中的数据。该功能由ShowDataWithDataGirdView()方法方法实现。实现。C#从入门到实践从入门到实践24.2.9 24.2.9 使用使用ListViewListView控件显示数据控件显示数据单击单击MainForm窗体中的窗体中的“显示数据

433、按钮可以在显示数据按钮可以在ListView控件中显示控件中显示CSharp3DB数据库的数据库的Data表中的数据。该功表中的数据。该功能由能由ShowDataWithListView()方法实现。方法实现。C#从入门到实践从入门到实践24.2.10 24.2.10 使用使用TreeViewTreeView控件显示数据控件显示数据单击单击MainForm窗体中的窗体中的“显示按钮可以在显示按钮可以在TreeView控件控件中显示中显示CSharp3DB数据库的数据库的Data表中的数据。该功能由表中的数据。该功能由ShowDataWithTreeView()方法实现。方法实现。C#从入门到实

434、践从入门到实践24.3 24.3 小结小结本章主要介绍了本章主要介绍了.NET Framework中中的数据访问功能,如中中的数据访问功能,如组成结构、根本对象、使用操作组成结构、根本对象、使用操作SQL Server数据库、使数据库、使用用DataGridView控件显示数据、使用控件显示数据、使用ListView控件显示控件显示数据、使用数据、使用TreeView控件显示数据等。其中,读者要着控件显示数据等。其中,读者要着重掌握根本对象,以及使用操作重掌握根本对象,以及使用操作SQL Server数据库的方数据库的方法,为后续编写功能强大的、处理数据特别是处理数法,为后续编写功能强大的、处

435、理数据特别是处理数据库中的数据的据库中的数据的C#程序代码奠定根底。下一章将要介程序代码奠定根底。下一章将要介绍使用绍使用C#语言开发图书管理系统的方法。语言开发图书管理系统的方法。C#从入门到实践从入门到实践24.4 24.4 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_24的的Windows应用程序,并实现以下功能。应用程序,并实现以下功能。1将名称为将名称为“Form1.cs的窗体添加到该应用程序中。的窗体添加到该应用程序中。2使用窗体实现用户管理功能包括查询、添加、修改使用窗体实现用户管理功能包括查询、添加、修改和删除用户

436、。其中,用户表和删除用户。其中,用户表User保存在名称为保存在名称为“UserDB的的SQL Server 2005数据库中,且该表包含数据库中,且该表包含3个列:个列:ID、Username和和Password。C#从入门到实践从入门到实践第第2525章章 图书管理系统图书管理系统图书管理系统是当前最为流行的管理系统之一,它一般包图书管理系统是当前最为流行的管理系统之一,它一般包括登录、主窗口、图书分类管理、书籍管理、借阅书籍、括登录、主窗口、图书分类管理、书籍管理、借阅书籍、归还书籍、浏览书籍等功能。本章将讲解使用归还书籍、浏览书籍等功能。本章将讲解使用Visual Studio 202

437、1开发图书管理系统应用程序的名称为开发图书管理系统应用程序的名称为“LibraryManager,数据库的名称为,数据库的名称为“LibraryManagerDB,数据库版本为,数据库版本为SQL Server 2005的方法,主要介绍以下知识点。的方法,主要介绍以下知识点。系统总体设计,包括功能设计、操作流程图、数据库设计系统总体设计,包括功能设计、操作流程图、数据库设计等。等。管理功能模块实现,包括管理员登录、主窗口、分类管理、管理功能模块实现,包括管理员登录、主窗口、分类管理、书籍管理、借阅书籍等功能。书籍管理、借阅书籍等功能。学生或教师功能模块实现,包括学生或教师登录、主窗口、学生或教

438、师功能模块实现,包括学生或教师登录、主窗口、归还书籍、浏览书籍等功能。归还书籍、浏览书籍等功能。C#从入门到实践从入门到实践25.1 25.1 系统总体设计系统总体设计本小节介绍图书管理系统本小节介绍图书管理系统LibraryManager应用程序的应用程序的总体设计,主要包括系统功能设计、操作流程图设计、总体设计,主要包括系统功能设计、操作流程图设计、图书管理系统应用程序的组成、图书管理系统应用程序的组成、LibraryManagerDB数数据库设计、数据库实体类设计、应用程序主入口、应用据库设计、数据库实体类设计、应用程序主入口、应用程序全局变量等。程序全局变量等。C#从入门到实践从入门到

439、实践25.1.1 25.1.1 系统功能设计系统功能设计图书管理系统可以分为两局部:管理员功能模块和学生或图书管理系统可以分为两局部:管理员功能模块和学生或老师功能模块。管理员功能模块为管理员提供效劳,它老师功能模块。管理员功能模块为管理员提供效劳,它提供的功能如下,操作流程如下图。提供的功能如下,操作流程如下图。C#从入门到实践从入门到实践25.1.2 25.1.2 图书管理系统组成图书管理系统组成图书管理系统应用程序的名称为图书管理系统应用程序的名称为“LibraryManager。在。在Visual Studio 2021的的“解决方案资源管解决方案资源管理器面板中查看理器面板中查看Li

440、braryManager应用程序,如下应用程序,如下图。图。LibraryManager应用程序的应用程序的组成元素说明如下。组成元素说明如下。C#从入门到实践从入门到实践25.1.3 25.1.3 数据库设计数据库设计图书管理系统使用名称为图书管理系统使用名称为“LibraryManagerDB的的Microsoft SQL Server 2005数据库,它包括数据库,它包括6个表:个表:Category、Group、User、Book、BookCategory和和UserBook表。表。1Category表表2Group表表3User表表4Book表表5BookCategory表表6Use

441、rBook表表C#从入门到实践从入门到实践25.1.4 25.1.4 数据库实体类设计数据库实体类设计图书管理系统为图书管理系统为LibraryManagerDB数据库创立名称为数据库创立名称为“LibraryManagerDB.dbml的的DBML文件,并把文件,并把LibraryManagerDB数据库所有的表数据库所有的表Category、Group、User、Book、BookCategory和和UserBook表添加到表添加到该文件中,如下图。该文件中,如下图。C#从入门到实践从入门到实践25.1.5 25.1.5 应用程序主入口应用程序主入口应用程序主入口的程序代码位于应用程序主入

442、口的程序代码位于Program.cs文件保存在文件保存在LibraryManage目录下中。该文件定义名称为目录下中。该文件定义名称为Program的静态类和的静态类和static void Main()静态方法。该静态静态方法。该静态方法调用方法调用Application类的类的Run()静态方法运行第一个窗静态方法运行第一个窗口口登录窗体即登录窗体即LoginForm类的实例类的实例C#从入门到实践从入门到实践25.1.6 25.1.6 应用程序全局变量应用程序全局变量图书管理系统在图书管理系统在LibrarySystem.cs文件中创立了文件中创立了LibrarySystem类,并定义了

443、一个全局的、静态的变量类,并定义了一个全局的、静态的变量UserID。该变量用来保存登录用户的。该变量用来保存登录用户的ID值。值。C#从入门到实践从入门到实践25.2 25.2 管理员模块实现管理员模块实现管理员功能模块共包括登录、主窗口、分类管理、书籍管管理员功能模块共包括登录、主窗口、分类管理、书籍管理、借阅书籍、查看借阅人等功能。管理员都能够通过理、借阅书籍、查看借阅人等功能。管理员都能够通过主窗口查看和浏览所有书籍,以及书籍的借阅情况;借主窗口查看和浏览所有书籍,以及书籍的借阅情况;借阅书籍窗口可以实现借阅书籍的功能,查看借阅人窗口阅书籍窗口可以实现借阅书籍的功能,查看借阅人窗口可以

444、查看某一个书籍的所有借阅人的信息。本小节介绍可以查看某一个书籍的所有借阅人的信息。本小节介绍这些功能模块木咛迨迪帧这些功能模块木咛迨迪帧C#从入门到实践从入门到实践25.2.1 25.2.1 管理员登录管理员登录管理员登录功能由管理员登录功能由LoginForm.cs窗体保存在窗体保存在LibraryManager目录下实现。管理员可以输入用户名目录下实现。管理员可以输入用户名和密码,单击和密码,单击“登录按钮实现登录功能,单击登录按钮实现登录功能,单击“取消取消按钮关闭该窗口。按钮关闭该窗口。C#从入门到实践从入门到实践25.2.2 25.2.2 主窗口主窗口管理员主窗口由管理员主窗口由Ma

445、inForm.cs窗体保存在窗体保存在LibraryManager目录下实现。该窗口以列表形式显示目录下实现。该窗口以列表形式显示指定分类下的书籍;管理员单击指定分类下的书籍;管理员单击“分类管理图标翻开分类管理图标翻开分类管理的窗口,单击分类管理的窗口,单击“添加新书籍按钮可以翻开书添加新书籍按钮可以翻开书籍管理窗口,单击籍管理窗口,单击“借阅书籍按钮翻开借阅书籍的窗借阅书籍按钮翻开借阅书籍的窗口。口。C#从入门到实践从入门到实践25.2.3 25.2.3 分类管理分类管理分类管理功能由分类管理功能由CategoryForm.cs窗体窗体保存在保存在LibraryManager/Admin目

446、录下实现。管理员可目录下实现。管理员可以创立和维护书籍的分类以创立和维护书籍的分类树,如添加新的分类、修树,如添加新的分类、修改分类名称、删除分类等。改分类名称、删除分类等。C#从入门到实践从入门到实践25.2.4 25.2.4 书籍管理书籍管理书籍管理功能由书籍管理功能由BookForm.cs窗体保存在窗体保存在LibraryManager/Admin目录下实现。管理员可以输目录下实现。管理员可以输入用户名和密码,单击入用户名和密码,单击“登录按钮实现登录功能,单登录按钮实现登录功能,单击击“取消按钮关闭该窗口。取消按钮关闭该窗口。C#从入门到实践从入门到实践25.2.5 25.2.5 借阅

447、书籍借阅书籍借阅书籍功能由借阅书籍功能由LendForm.cs窗体保存在窗体保存在LibraryManager目录下实现。该窗体实现借阅指定书目录下实现。该窗体实现借阅指定书籍给指定用户的功能。管理员可以选择借阅书籍的用户。籍给指定用户的功能。管理员可以选择借阅书籍的用户。C#从入门到实践从入门到实践25.2.6 25.2.6 查看借阅人查看借阅人查看借阅人功能由查看借阅人功能由LendUserInfoForm.cs窗体保存在窗体保存在LibraryManager目录下实现。该窗口可以以列表方式目录下实现。该窗口可以以列表方式显示指定书籍的所有借阅人的信息。显示指定书籍的所有借阅人的信息。C#

448、从入门到实践从入门到实践25.3 25.3 学生和老师功能模块实现学生和老师功能模块实现学生和老师功能模块共包括登录、主窗口、归还书籍、查学生和老师功能模块共包括登录、主窗口、归还书籍、查看书籍信息、浏览书籍、借阅书籍等功能。学生和老师看书籍信息、浏览书籍、借阅书籍等功能。学生和老师都能够通过主窗口查看其所借阅的书籍,并能够归还书都能够通过主窗口查看其所借阅的书籍,并能够归还书籍;浏览书籍窗口可以根据书籍分类浏览各种书籍,并籍;浏览书籍窗口可以根据书籍分类浏览各种书籍,并借阅书籍。本小节介绍这些功能模块的具体实现。借阅书籍。本小节介绍这些功能模块的具体实现。C#从入门到实践从入门到实践25.3

449、.1 25.3.1 学生或老师登录学生或老师登录学生或老师登录功能也是由学生或老师登录功能也是由LoginForm.cs窗体保存在窗体保存在LibraryManager目录下实现。学生或老师也可以输入目录下实现。学生或老师也可以输入用户名和密码,单击用户名和密码,单击“登录按钮实现登录功能,单击登录按钮实现登录功能,单击“取消按钮关闭该窗口。由于已经在小节介绍了该窗取消按钮关闭该窗口。由于已经在小节介绍了该窗体的实现,因此,在此不做详细介绍。体的实现,因此,在此不做详细介绍。C#从入门到实践从入门到实践25.3.2 25.3.2 主窗口主窗口学生和老师角色的主窗口都为由学生和老师角色的主窗口都

450、为由UserForm.cs窗体保存在窗体保存在LibraryManager目录下实现。该窗口以列表形式显示目录下实现。该窗口以列表形式显示学生或老师已借的所有书籍;学生或老师单击学生或老师已借的所有书籍;学生或老师单击“归还书归还书籍按钮可以归还选择的书籍;单击籍按钮可以归还选择的书籍;单击“浏览书籍按钮浏览书籍按钮可以翻开浏览书籍的窗口。可以翻开浏览书籍的窗口。C#从入门到实践从入门到实践25.3.3 25.3.3 归还书籍归还书籍当用户单击当用户单击UserForm.cs窗体中的窗体中的“归还书籍按钮归还书籍按钮btnReturn控件触发控件触发Click事件事件btnReturn_Cli

451、ck(object sender, EventArgs e)。该事件实。该事件实现归还书籍的功能。现归还书籍的功能。C#从入门到实践从入门到实践25.3.4 25.3.4 查看书籍信息查看书籍信息查看书籍信息功能由查看书籍信息功能由BookInfoForm.cs窗体保存窗体保存在在LibraryManager目录下目录下实现。该窗口可以显示指定实现。该窗口可以显示指定书籍的详细信息,如名称、书籍的详细信息,如名称、作者、作者、ISBN、出版单位、出、出版单位、出版时间、数量、状态、电子版时间、数量、状态、电子文档、封面图片、图书简介、文档、封面图片、图书简介、图书分类等。图书分类等。C#从入门

452、到实践从入门到实践25.3.5 25.3.5 浏览书籍浏览书籍浏览书籍功能由浏览书籍功能由BrowserForm.cs窗体保存在窗体保存在LibraryManager目录下实现。该窗口根据分类、以列目录下实现。该窗口根据分类、以列表形式显示书籍信息,单击表形式显示书籍信息,单击“借阅链接可以借阅当前借阅链接可以借阅当前行表示的书籍。行表示的书籍。C#从入门到实践从入门到实践25.3.6 25.3.6 借阅书籍借阅书籍当用户单击当用户单击“浏览书籍窗口浏览书籍窗口BrowserForm.cs窗体中窗体中每一行中的每一行中的“借阅链接时,可以实现借阅该行表示的借阅链接时,可以实现借阅该行表示的书籍

453、。该功能的实现方式和小节中借阅书籍功能相似,书籍。该功能的实现方式和小节中借阅书籍功能相似,因此,在此不做详细介绍。因此,在此不做详细介绍。C#从入门到实践从入门到实践25.4 25.4 小结小结本章主要介绍了使用本章主要介绍了使用C#语言在语言在Visual Studio 2021集成开发集成开发环境中开发图书管理系统的方法,主要包括功能设计、环境中开发图书管理系统的方法,主要包括功能设计、操作流程图、数据库设计,以及管理员登录、主窗口、操作流程图、数据库设计,以及管理员登录、主窗口、分类管理、书籍管理、借阅书籍、学生或教师登录、主分类管理、书籍管理、借阅书籍、学生或教师登录、主窗口、归还书

454、籍、浏览书籍等功能的开发方法。其中,窗口、归还书籍、浏览书籍等功能的开发方法。其中,读者要着重掌握使用读者要着重掌握使用Windows窗体编程的方法,为后续窗体编程的方法,为后续编功能强大的编功能强大的Windows应用程序奠定根底。下一章将要应用程序奠定根底。下一章将要介绍介绍P2P点对点聊天程序。点对点聊天程序。C#从入门到实践从入门到实践25.5 25.5 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_25的的Windows应用程序,并在该应用程序中实现用户管应用程序,并在该应用程序中实现用户管理功能。理功能。C#从入门到实践

455、从入门到实践第第2626章章 P2P P2P聊天工具聊天工具P2P聊天工具是当前最为流行的点对点的聊天工具,它一聊天工具是当前最为流行的点对点的聊天工具,它一般包括聊天工具的效劳器、聊天工具的客户端等功能模般包括聊天工具的效劳器、聊天工具的客户端等功能模块。本章将讲解使用块。本章将讲解使用Visual Studio 2021集成开发环境开集成开发环境开发发P2P聊天工具名称为聊天工具名称为“P2PTalk的方法,主要介的方法,主要介绍以下知识点。绍以下知识点。系统总体设计,包括功能设计、系统总体设计,包括功能设计、P2P聊天工具组成等;聊天工具组成等;P2P聊天工具类库实现;聊天工具类库实现;

456、P2P聊天工具效劳器聊天窗口实现;聊天工具效劳器聊天窗口实现;P2P聊天工具客户端聊天窗体实现。聊天工具客户端聊天窗体实现。C#从入门到实践从入门到实践26.1 26.1 系统总体设计系统总体设计本小节介绍本小节介绍P2P聊天工具聊天工具P2PTalk工程的总体设计,主工程的总体设计,主要包括系统功能设计、要包括系统功能设计、P2P聊天工具的组成等。聊天工具的组成等。C#从入门到实践从入门到实践26.1.1 26.1.1 系统功能设计系统功能设计P2P聊天工具可以分为两局部:聊天工具可以分为两局部:P2P聊天工具客户端局部功聊天工具客户端局部功能模块和能模块和P2P聊天工具效劳器端局部功能模块

457、。聊天工具效劳器端局部功能模块。P2P聊天聊天工具的客户端局部和效劳器端局部功能模块都实现相同工具的客户端局部和效劳器端局部功能模块都实现相同的功能,具体描述如下。的功能,具体描述如下。连接效劳器,连接到指定的聊天效劳器。连接效劳器,连接到指定的聊天效劳器。断开效劳器的连接,断开已经连接的聊天效劳器。断开效劳器的连接,断开已经连接的聊天效劳器。退出聊天,退出聊天状态,并释放占有的资源。退出聊天,退出聊天状态,并释放占有的资源。发送聊天消息,可以将消息发送到效劳器。发送聊天消息,可以将消息发送到效劳器。C#从入门到实践从入门到实践26.1.2 P2P26.1.2 P2P聊天工具组成聊天工具组成P

458、2P聊天工具工程的名称为聊天工具工程的名称为“P2PTalk。在。在Visual Studio 2021的的“解决方案资源管理器面板中查看解决方案资源管理器面板中查看P2PTalk工工程,如下图。程,如下图。P2PTalk工程包括工程包括3个应用程序,具体说明个应用程序,具体说明如下。如下。Client应用程序,应用程序,P2P聊天工具的客户端应用程序。聊天工具的客户端应用程序。P2PTalkLibrary类库,类库,P2P聊天工具的类库,封装了实现聊天工具的类库,封装了实现聊天功能的类。聊天功能的类。Server应用程序,应用程序,P2P聊天工具的效劳器端应用程序。聊天工具的效劳器端应用程序

459、。C#从入门到实践从入门到实践26.2 P2P26.2 P2P聊天工具类库实现聊天工具类库实现P2P聊天工具类库由聊天工具类库由P2PTalkLibrary工程实现,该工程的工程实现,该工程的类型为类型为C#类库。如果生成该工程成功,将创立一个名称类库。如果生成该工程成功,将创立一个名称为为“P2PTalkLibrary.dll的动态链接库文件保存在的动态链接库文件保存在该工程的该工程的bin目录下。目录下。P2PTalkLibrary工程包括两个类文件:和工程包括两个类文件:和Tool.cs,它们分,它们分别包含别包含P2P类和类和Tool类。下面将详细介绍这两个类的功类。下面将详细介绍这两

460、个类的功能。能。C#从入门到实践从入门到实践26.2.1 Tool26.2.1 Tool类类Tool类被包含在命名空间中,并引用了类被包含在命名空间中,并引用了2个命名空间:和。个命名空间:和。C#从入门到实践从入门到实践26.2.2 P2P26.2.2 P2P类类P2P类被包含在命名空间中,并引用了类被包含在命名空间中,并引用了2个命名空间:和。个命名空间:和。C#从入门到实践从入门到实践26.3 P2P26.3 P2P聊天工具效劳器聊天窗口聊天工具效劳器聊天窗口P2P聊天工具效劳器由聊天工具效劳器由Server工程实现,工程实现,P2P聊天工具效劳聊天工具效劳器聊天窗口由该工程下的器聊天窗

461、口由该工程下的MainForm.cs窗体保存在窗体保存在P2PTalk目录下实现。用户可以通过该窗口连接效劳目录下实现。用户可以通过该窗口连接效劳器,并和其他用户进行聊天。用户单击器,并和其他用户进行聊天。用户单击“连接按钮可连接按钮可以连接到指定的效劳器,单击以连接到指定的效劳器,单击“断开按钮可以断开效断开按钮可以断开效劳器的连接,单击劳器的连接,单击“退出按钮可以结束当前聊天状态,退出按钮可以结束当前聊天状态,单击单击“发送按钮可以将详细发送给其他在线用户。发送按钮可以将详细发送给其他在线用户。C#从入门到实践从入门到实践26.4 P2P26.4 P2P聊天工具客户端聊天窗口聊天工具客户

462、端聊天窗口由于由于P2P聊天工具客户端聊天窗口和聊天工具客户端聊天窗口和P2P聊天工具效劳器聊聊天工具效劳器聊天窗口功能上非常相似,实现方法也比较相似。因此,天窗口功能上非常相似,实现方法也比较相似。因此,在此不做详细介绍。在此不做详细介绍。C#从入门到实践从入门到实践26.5 26.5 小结小结本章主要介绍了使用本章主要介绍了使用C#语言在语言在Visual Studio 2021集成开发集成开发环境中开发环境中开发P2P聊天工具的方法,主要包括功能设计、聊天工具的方法,主要包括功能设计、P2P聊天工具组成,以及聊天工具组成,以及P2P聊天工具类库、聊天工具类库、P2P聊天工聊天工具效劳器聊

463、天窗口、具效劳器聊天窗口、P2P聊天工具客户端聊天窗体等功聊天工具客户端聊天窗体等功能的开发方法。其中,读者要着重掌握能的开发方法。其中,读者要着重掌握P2P聊天工具类聊天工具类库和库和P2P聊天工具客户端聊天窗体的方法,为后续编功聊天工具客户端聊天窗体的方法,为后续编功能强大的网络应用程序奠定根底。下一章将要介绍使用能强大的网络应用程序奠定根底。下一章将要介绍使用技术技术C#开发校内网的方法。开发校内网的方法。C#从入门到实践从入门到实践26.6 26.6 习题习题在在Server应用程序小节中添加用户管理功能,并实现应用程序小节中添加用户管理功能,并实现可以将指定的消息仅仅发送的指定的某一

464、个用户个功能。可以将指定的消息仅仅发送的指定的某一个用户个功能。C#从入门到实践从入门到实践第第2727章章 我的校内网我的校内网校内网是当前最为流行的交流网站之一,它一般包括登录、校内网是当前最为流行的交流网站之一,它一般包括登录、主页面、好友、相册、日志、聊天等功能。本章将讲解主页面、好友、相册、日志、聊天等功能。本章将讲解使用使用Visual Studio 2021集成开发环境开发校内网网站集成开发环境开发校内网网站名称为名称为“MyXiaonei,数据库的名称为,数据库的名称为“XiaoneiDB,数据库版本为数据库版本为SQL Server 2005的方法,主要介绍以下的方法,主要介

465、绍以下知识点。知识点。系统总体设计,包括功能设计、数据库设计等。系统总体设计,包括功能设计、数据库设计等。常用功能模块实现,包括登录、主页面、好友、相册、日常用功能模块实现,包括登录、主页面、好友、相册、日志等功能。志等功能。C#从入门到实践从入门到实践27.1 27.1 系统总体设计系统总体设计本小节介绍校内网本小节介绍校内网MyXiaonei网站的总体设计,主要网站的总体设计,主要包括系统功能设计、包括系统功能设计、MyXiaonei网站的组成、网站的组成、XiaoneiDB数据库设计、数据库实体类设计、标题模块、网站配置数据库设计、数据库实体类设计、标题模块、网站配置等。等。C#从入门到

466、实践从入门到实践27.1.1 27.1.1 系统功能设计系统功能设计校内网网站比较复杂,在此,仅仅介绍常用的功能,主要校内网网站比较复杂,在此,仅仅介绍常用的功能,主要包括登录、好友浏览好友、添加好友等、相册浏包括登录、好友浏览好友、添加好友等、相册浏览照片、上传照片等、日志等功能,具体描述如下。览照片、上传照片等、日志等功能,具体描述如下。用户登录,验证用户的身份是否合法。用户登录,验证用户的身份是否合法。主页面,校内网网站的主页面。主页面,校内网网站的主页面。我的好友,按照分类方式浏览好友。我的好友,按照分类方式浏览好友。添加好友,可以查询用户,并添加为好友。添加好友,可以查询用户,并添加

467、为好友。我的相册,按照分类方式浏览照片。我的相册,按照分类方式浏览照片。上传照片,上传照片到效劳器,并指定相应的分类。上传照片,上传照片到效劳器,并指定相应的分类。我的日志,按照分类方式浏览日志。我的日志,按照分类方式浏览日志。添加日志,将新的日志添加到指定的分类下。添加日志,将新的日志添加到指定的分类下。C#从入门到实践从入门到实践27.1.2 27.1.2 校内网组成校内网组成校内网网站的名称为校内网网站的名称为“MyXiaonei。在。在Visual Studio 2021的的“解决方案资源管理器面板中查看解决方案资源管理器面板中查看MyXiaonei网站,网站,如下图。如下图。C#从入

468、门到实践从入门到实践27.1.3 27.1.3 数据库设计数据库设计校内网网站使用名称为校内网网站使用名称为“XiaoneiDB的的Microsoft SQL Server 2005数据库,它包括数据库,它包括6个表:个表:Category、Group、User、Book、BookCategory和和UserBook表。表。1User表表2Category表表3Friend表表4Log表表5Photo表表C#从入门到实践从入门到实践27.1.4 27.1.4 数据库实体类设计数据库实体类设计校内网网站为校内网网站为XiaoneiDB数据库创立名称为数据库创立名称为“XiaoneiDB.dbml

469、的的DBML文件,并把文件,并把XiaoneiDB数数据库所有的表据库所有的表User、Category、Friend、Log和和Photo表添加到该文件中,如下图。表添加到该文件中,如下图。C#从入门到实践从入门到实践27.1.5 27.1.5 标题模块标题模块标题模块由标题模块由TitleUC.ascx用户控件实现,它将用来显示标题。用户控件实现,它将用来显示标题。C#从入门到实践从入门到实践27.1.6 27.1.6 配置文件配置文件Web.configWeb.configMyXiaonei网站的连接字符串放置在网站的连接字符串放置在Web.config配置文件的配置文件的元素中元素中C

470、#从入门到实践从入门到实践27.2 27.2 常用功能模块实现常用功能模块实现校内网网站的常用功能模块主要包括登录、好友浏览好校内网网站的常用功能模块主要包括登录、好友浏览好友、添加好友等、相册浏览照片、上传照片等、友、添加好友等、相册浏览照片、上传照片等、日志等功能。本小节将介绍这些功能的具体实现方法。日志等功能。本小节将介绍这些功能的具体实现方法。C#从入门到实践从入门到实践27.2.1 27.2.1 登录页面登录页面登录功能由登录功能由Default.aspx页面实现,页面实现,Default.aspx.cs文件为文件为它的代码隐藏文件。该页面提供了输入用户名和密码的它的代码隐藏文件。该

471、页面提供了输入用户名和密码的文本框,并实现用户登录的功能。文本框,并实现用户登录的功能。Default.aspx页面的效页面的效果图如下图。果图如下图。1界面设计界面设计2事件设计事件设计C#从入门到实践从入门到实践27.2.2 27.2.2 主页面主页面校内网主页面由校内网主页面由Main.aspx和和LeftTree.aspx页面共同实现。页面共同实现。Main.aspx页面使用了框架,并放置了两个页面使用了框架,并放置了两个元素,元素,它们的它们的name属性的值分别为:属性的值分别为:Left和和Desktop。其中,。其中,Left框架放置框架放置LeftTree.aspx页面,页面

472、,Desktop框架默认放置框架默认放置MyFriend.aspx页面。页面。C#从入门到实践从入门到实践27.2.3 27.2.3 我的好友我的好友我的好友由我的好友由MyFriend.aspx页面实现,页面实现,MyFriend.aspx.cs文文件为它的代码隐藏文件。该页面按照系统默认的分类显件为它的代码隐藏文件。该页面按照系统默认的分类显示当前登录用户的好友。示当前登录用户的好友。MyFriend.aspx页面的效果图页面的效果图如下图。如下图。1界面设计界面设计2初始化初始化3事件设计事件设计C#从入门到实践从入门到实践27.2.4 27.2.4 添加好友添加好友添加好友由添加好友由

473、AddFriend.aspx页面实现,页面实现,AddFriend.aspx.cs文件为它的代码隐藏文件。该页面为考生提供选择考试文件为它的代码隐藏文件。该页面为考生提供选择考试科目的功能,并显示用户名称和考试时间。科目的功能,并显示用户名称和考试时间。AddFriend.aspx页面的效果图如下图。页面的效果图如下图。1界面设计界面设计2初始化初始化3事件设计事件设计C#从入门到实践从入门到实践27.2.5 27.2.5 我的相册我的相册我的相册由我的相册由MyPhoto.aspx页面实现,页面实现,MyPhoto.aspx.cs文件文件为它的代码隐藏文件。该页面按照系统默认的分类显示为它的

474、代码隐藏文件。该页面按照系统默认的分类显示当前登录用户的照片。当前登录用户的照片。MyPhoto.aspx页面的效果图如下页面的效果图如下图。图。1界面设计界面设计2初始化初始化3事件设计事件设计C#从入门到实践从入门到实践27.2.6 27.2.6 上传照片上传照片上传照片由上传照片由UploadPhoto.aspx页面实现,页面实现,UploadPhoto.aspx.cs文件为它的代码隐藏文件。该页面文件为它的代码隐藏文件。该页面为用户提供上传照片的功能。其中,照片的文件保存到为用户提供上传照片的功能。其中,照片的文件保存到硬盘,照片的信息保存到数据库。硬盘,照片的信息保存到数据库。Upl

475、oadPhoto.aspx页页面的效果图如下图。面的效果图如下图。1界面设计界面设计2初始化初始化3事件设计事件设计C#从入门到实践从入门到实践27.2.7 27.2.7 我的日志我的日志我的日志由我的日志由MyLog.aspx页面实现,页面实现,MyLog.aspx.cs文件为它文件为它的代码隐藏文件。该页面按照系统默认的分类显示当前的代码隐藏文件。该页面按照系统默认的分类显示当前登录用户的日志。登录用户的日志。MyLog.aspx页面的效果图如下图。页面的效果图如下图。1界面设计界面设计2初始化初始化3事件设计事件设计C#从入门到实践从入门到实践27.2.8 27.2.8 添加日志添加日志

476、添加日志由添加日志由AddLog.aspx页面实现,页面实现,AddLog.aspx.cs文件为文件为它的代码隐藏文件。该页面为考生提供输入日志标题和它的代码隐藏文件。该页面为考生提供输入日志标题和内容,并提交到数据库的功能。内容,并提交到数据库的功能。AddLog.aspx页面的效页面的效果图如下图。果图如下图。1界面设计界面设计2初始化初始化3事件设计事件设计C#从入门到实践从入门到实践27.3 27.3 小结小结本章主要介绍了使用本章主要介绍了使用C#语言在语言在Visual Studio 2021集成开发集成开发环境中开发校内网的方法,主要包括统总体设计,包括环境中开发校内网的方法,主

477、要包括统总体设计,包括功能设计、数据库设计,以及登录、主页面、好友、相功能设计、数据库设计,以及登录、主页面、好友、相册、日志、聊天等功能的开发方法。其中,读者要着重册、日志、聊天等功能的开发方法。其中,读者要着重掌握使用掌握使用Web窗体编程的方法,为后续编功能强大的网窗体编程的方法,为后续编功能强大的网站奠定根底。站奠定根底。C#从入门到实践从入门到实践27.4 27.4 习题习题在在Visual Studio 2021集成开发环境中创立名称为集成开发环境中创立名称为“Test_27的网站,并在该网站中实现用户管理功能。的网站,并在该网站中实现用户管理功能。C#从入门到实践从入门到实践C#从入门到实践从入门到实践谢谢!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号