Visual C#程序设计应用教程 第2版(txt+pdf+epub+mobi电子书下载)


发布时间:2021-03-29 13:20:42

点击下载

作者:郭力子,陆红蕾,朱二喜

出版社:机械工业出版社

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

Visual C#程序设计应用教程 第2版

Visual C#程序设计应用教程 第2版试读:

前言

Visual C#是微软公司的Visual StudioꆡNET开发平台上面向对象的编程语言。作为一种继承自C/C ++和Java的语言,Visual C#简单易学、面向对象而且类型安全,已成为当今计算机程序设计的主流编程语言。由于借鉴了Java、C ++、C甚至VB的优点,Visual C#既具有C、C ++的强大功能,又具有Java的面向对象机制,还兼有类似VB开发的高效率和方便性。使用这种面向对象的、可视化的编程语言,结合事件驱动的模块设计,使程序设计变得轻松快捷。

本书编写的指导思想,是突出实际应用,注重能力培养。在教材内容的编排上,注意做到简明扼要、由浅入深、循序渐进,力求通俗易懂、简洁实用。

本书全面兼顾了知识介绍、编程能力培养和实践技能训练。每章节重要的知识点都有相应的案例,这些案例简单明了、实用性强,力求带给读者真实的编程体验。每一章后都配有实训,很多都是书中案例的扩展,有助于读者实践。另外还配有丰富的习题供读者练习,以巩固已学的知识内容。为了帮助读者快速理解,书中案例前都有关于代码编写的简要分析、代码部分尽量给予注释、案例后针对重要或易错的内容还有提示说明。读者通过仔细研读这些代码和实训操作,可以迅速培养和提高独立解决实际编程问题的能力。

此次修订,在保持原书系统、易学的特点和基本框架的基础上,看重增加了部分新知识内容。全书共分11章,内容包括C#和Visual Studio 2015、变量与表达式、流程控制和异常处理、面向对象编程基础、面向对象编程进阶、字符串及集合与泛型、Windows窗体应用程序设计、进程与线程、数据库访问、文件处理和GDI +绘图基础和WPF程序设计基础。

本书可作为高职高专或其他高等院校相关专业的教材,也可作为C#程序设计培训机构成.NET开发人员的教材或参考书。建议读者遵循书中介绍的方法和步骤实际建立案例程序,然后对案例程序进行修改或扩展,并通过对案例代码进行分析和讨论以掌握案例背后所包含的概念、原理、知识点和方法等,这是学习程序设计最稳妥、有效和快捷的途径。

在编写本书的过程中,作者参考了大量相关技术资料,吸取了许多同仁的经验,在此谨表谢意。

鉴于作者水平有限,难免在书中出现错误和不足之处,恳请广大读者批评指正。作者

第1章 C#和Visual Studio 2015

本章要点

● C#语言简介

● Visual Studio 2015集成开发环境

1.1 C#语言简介

C#(读作“C Sharp”)语言是由微软公司开发的基于.NET框架(.NET Framework)的一种程序设计语言。它是一种面向对象和类型安全的程序设计语言,继承了C语言的语法、关键词和运算符,是在C ++定义的对象模型基础上加以改进而开发的,同时与Java又有很多相似的地方。

C#语言是建立在.NET框架环境之上的。ꆡNET框架是一个类库,为C#语言开发的应用程序提供了强大的类库支持,同时,它不仅仅支持C#语言,还支持VB.NET和C ++等其他的托管方式。C#语言是.NET框架平台首选开发语言,也常被直接简称为C#,而ꆡNET框架常被直接简称为.NET。1..NET框架及开发环境

.NET框架(.NET Framework)是微软公司的一个多语言组件开发和运行环境,其目的是在统一框架下,可以应用多种语言,创建、配置和运行Windows应用程序和Web应用程序。其组成部分如图1-1所示。图1-1 .NET框架的组成

.NET为开发人员提供了功能强大、种类丰富的管理与开发工具。这些工具包括:.NET的集成开发环境Visual Studio 20 ××(从2002年以来,Visual Studio的发展经历了许多版本),以及一些相关的工具,如编译、连接、反汇编、证书管理、注册工具、XML工具,等等。

.NET框架通常由安装程序自动安装,如安装Visual Studio 2015软件包时将自动安装.NET.Framework4.5.2。2.C#语言的特点

C#语言代表着程序设计语言演变的一个新阶段,它继承了C ++和Java这两种世界上最重要的计算机语言的优点,并且还增加了委托、索引等创新性特点。同时,C#语言利用了ꆡNET作为其强大的平台,使得它在Windows图形用户界面、ASP.NETWeb应用、XML.Web服务及ADO.NET数据库等方面有广泛的应用。总体而言,C#语言的主要特点在于:

● 简单易学。

● 面向对象。

● 与Web的紧密结合。

● 安全稳定。

● 支持多线程。

● 丰富的类库。

● 灵活性与兼容性。

1.2 VisualStudio2015集成开发环境

目前,Microsoft Visual Studio系列产品的常用版本是Visual Studio 2015版(以下简称为VS 2015)。而VS2015中的社区版(Visual Studio Community 2015)是免费产品,具备所有为Windows、iOS、Android设备或是云服务器开发桌面、移动、网页应用的全套功能。该版本针对小公司、初创企业、学生和开源软件开发者们,开发的非企业级软件,提供了一个统一的客户端和服务器开发的平台,支持移动跨平台开发,可扩展,编程功能先进、高效。

在VS 2015中可以实现:

● 可视化的窗口和网页设计器。支持以拖动方式生成控件,同时提供源码查看视图。

● 智能化的代码编辑器。支持语句自动完成、语法检查等功能。

● 集成的编译、调试功能。

● 项目管理功能:生成并管理应用程序文件,并可将应用程序安装到远程服务器上。

VS 2015集成开发环境包括了菜单栏、工具栏、工具箱、属性窗口、解决方案资源管理器等各功能窗口,如图1-2所示。选择“视图”菜单下的相关命令显示或关闭各个功能窗口。各个窗口可以打开后重叠在同一位置上。通过切换各窗口顶部或底部的选项标签就可以在不同的窗口之间进行切换。单击窗口右上角的按钮可以把窗口固定在所在的位置,这时该按钮变成,再次单击该按钮,可使窗口重新浮动。1.2.1 菜单栏与工具栏

VS 2015的菜单栏包括多个菜单项,会根据不同的使用状况而显示,如图1-3所示,使用这些菜单项以及它们的子菜单提供的命令可以完成几乎所有Visual Studio的功能。对应这些菜单项,工具栏提供了更为直接方便的选项。使用【视图】|【工具栏】窗口命令,就可以确定需要在窗口中显示的不同的工具栏。图1-2 Visual Studio 2015集成开发环境图1-3 VS 2015的菜单栏

菜单栏中的每个菜单都有标题,每个标题都有一个下拉式菜单。1.2.2 设计器与编辑器窗口

设计器与编辑器窗口是位于图1-2和图1-4的中间的窗口。在设计器和编辑器窗口中图1-4 设计器与编辑器窗口

可以进行应用程序的界面设计、源代码、HTML页、CSS表单及资源的编辑、开发工作。设计器与编辑器窗口的使用有如下特点:

1)采用“智能感知”技术,使得我们在编码时,不必离开文本编辑器以执行语言元素搜索,可以保持上下文、查找所需的信息、直接向代码中插入语言元素如图1-4所示。

2)语法着色。默认情况下,常规代码为黑色,注释为绿色,而C#语言的关键字为蓝色。1.2.3 解决方案资源管理器窗口

解决方案资源管理器窗口用于管理和监控方案中的项目,其通常位于VisualStudio界面的右上方,如图1-2所示。在菜单栏中选择【视图】|【解决方案资源管理器】命令,可以打开解决方案资源管理器窗口。

一个解决方案中可以包含多个项目,它使用户能够方便地组织需要开发和设计的项目和文件,以及配置应用程序或组件。解决方案资源管理器中采用树状视图显示方案及其中方案中项目的层次结构。方案中包含项目及项目中的条目。1.2.4 工具箱窗口

工具箱窗口默认位于VS 2015界面的左方,如图1-2所示。选择【视图】|【工具箱】菜单命令可以打开工具箱。

工具箱窗口中包令若干个标签,展开这些标签,可以显示不同种类的控件。这些控件是Visual Studio提供的封装好的.NET框架的各种类的对象。使用时可用鼠标将其拖放到设计器窗口的表单上。1.2.5 属性窗口

属性窗口通常位于VS 2015界面的右下方,如图1-2所示。选择【视图】|【属性窗口】菜单命令可以打开当前对象的属性窗口。

属性定义窗体、文档或控件的状态、行为和外观。多数图形控件包含可更改以定义其可视外观的属性。控件、文档和窗体具有一些指定它们将如何与用户进行交互,以及在运行时操作过程中需要的信息的属性。可以使用属性窗口编辑和查看文件、项目和方案属性。此外,属性窗口还能在设计时查看和修改设计器中被选对象的属性和事件。1.2.6 服务器资源管理器窗口

服务器资源管理器窗口与工具箱窗口共享显示区域,单击工具箱窗口下方的“服务器资源管理器”选项卡就可以切换到服务器资源管理器窗口。或者选择【视图】|【服务器资源管理器】菜单命令,可以打开服务器资源管理器窗口。

服务器资源管理器是Visual Studio的服务器控制台,通过它可以查看和操作服务器及其中包含的数据库。例如,可以通过服务器资源管理器连接数据库、创建数据库表或将数据库表拖放到表格、图表或查询中。

1.3 创建C#应用程序

在VS 2015中,可以便捷地使用C#语言可以开发控制台应用程序、Windows窗体应用程序(简称为WinForm程序)、Web应用程序以及WPF应用程序等其他各种软件程序。1.3.1 创建控制台应用程序【例1-1】创建一个控制台应用程序。

在VS 2015中,创建控制台应用程序的过程如下:

1)启动VS 2015。

2)依次选择【文件】|【新建】|【项目】菜单命令,打开【新建项目】对话框(见图1-5)。图1-5 新建控制台应用程序

3)在左侧“模板”中选择【Visual C#】节点,然后选择【Windows】|【控制台应用程序】菜单命令。输入应用程序名称“Console Hello”,选择合适的路径保存。

4)单击【确定】按钮。VS 2015将创建项目“Console Hello”,并在解决方案资源管理器窗口中列出为Console Hello项目自动生成的文件,同时在编辑器窗口中显示出Program.cs文件生成的程序框架(见图1-6)。图1-6 Program.cs文件生成的程序框架

5)在编辑器窗口的空的Program.cs程序框架中添加代码如下(加黑的行):

6)选择【调试】|【启动调试】菜单命令(或按〈F5〉键)运行程序。运行后弹出Windows的命令窗口,在其中显示“HelloC#World!”字样。请见图1-7。图1-7 程序运行结果

程序说明:

1)C#语言源文件是以cs作为文件的扩展名。C#语言是严格区分大小写的。

2)在C#语言中使用using语句导入命名空间(.NET Framwork类库中预定义的类),命名空间提供了一种分层结构来组织一个或多个程序的元素。通过使用“using System;”声明,表明程序可以引用该“System”命名空间内的类及方法。如果不导入命名空间,则当使用该命名空间内的类时,必须在类的前面添加“Systemꆡ”的限制符,如使用Consolo类时就应该修改为System.Console。

3)程序的第二行class Program声明了一个类,类的名字叫作Program。C#程序中每个变量或函数都必须属于一个类,包括主函数Main()。

4)C#语言程序总是从Main()方法开始执行,而且必须采用staticvoidMain()的写法,程序中只能使用一个Main()方法。

5)在控制台程序中,输入输出功能是通过Console类来完成的,Console是在命名空间System中已经定义好的一个类。1.3.2 控制台程序的输入与输出

在程序设计中,输入与输出I/O(Input/Output)是程序应用的必需功能。上例中C#语言的I/O主要是通过命名空间System中的Console类实现的,该类给出了标准的输入和输出方法。

1.输入

控制台输入主要包含两个用来实现控制台输入的方法:Read()和ReadLine()。(1)Read()方法

Read()方法每次从标准输入流中读取一个字符(程序运行到Read()语句时暂停,直到户输入任意字符并按〈Enter〉键才返回继续运行),程序将接收的字符作为int型值返回给变量,如果输入流中没有可用的字符,则返回-1。Read()方法使用格式为:

Conso1e.Read();

例如:

inti=ConSole.Read();

charch=(char)Console.Read(); //将获取的int值强制转换为char值(2)Read Line()方法

ReadLine()方法用于从控制台一次读取一行字符串,直到遇到〈Enter〉键才返回读取的字符串。但此字符串不包含〈Enter〉键和换行符(“\r\n”),如果没有接收任何输入或接收了无效输入,则ReadLine()方法将返回null。ReadLine()方法的使用格式为:

ConsoLe.ReadLine();

例如:

strings=Console.ReadLine(); //将输入的内容赋值给字符串s

2.输出

控制台输出包含两个方法:Write()和WriteLine()。它们都可以输出一个或多个值,两者之间的区别只是Write()方法后没有换行符,而WriteLine()方法后有一个换行符。两个方法都有各种不同的重载,以供输出许多不同的数据类型之用。基本的使用格式如下:

Console.Write("格式串",参数表);

Console.WriteLine("格式串",参数表);

例如下列语句将输出字符串:

Console.Write("我学习C#。"); //输出字符串“我学习C#。”

string Name=Console.ReadLine();

string Age=Console.ReadLine();

//下面输出字符串:“我的姓名是X,年龄Y岁”,此处X是变量Name的值,Y是变量Age的值

Console.Write("我的姓名是{0},年龄{1}岁。",Name,Age);1.3.3 创建Windows窗体应用程序

Windows操作系统是一个多任务的操作系统,它允许同时运行多个程序(如鼠标、键盘、打印机的动作及声音、图像的运行等),实施统一管理。Windows把系统的动作都看作事件(消息),如单击鼠标左键,发送单击鼠标左键事件;用户按下键盘,发送键盘被按下的事件等。Windows操作系统统一负责管理所有的事件,把事件发送到各个运行程序,而各运行程序再用一个函数来响应事件,这个函数称作事件响应函数。这种方法称作事件驱动。每个事件都有它自己的事件响应函数,当接到Windows事件后,自动执行此事件的事件响应函数。Windows应用程序就是事件驱动程序,Windows应用程序的主要编程工作就是编制这些事件的处理函数,以完成相应的事件过程。【例1-2】创建一个Windows窗体应用程序。

在VS 2015中,创建Windows窗体的过程如下:

1)启动VS 2015。

2)依次选择【文件】|【新建】|【项目】菜单命令,打开【新建项目】对话框,如图1-8所示。图1-8 【新建项目】对话框

3)在左侧“模板”中选择【Visual C#】节点,然后选择【Windows】|【Windows应用程序】菜单命令。输入应用程序名称“Windows Hello”,选择合适的路径保存。

4)单击【确定】按钮。Visual Studio将创建项目“Windows Hello”,此时Visual Studio在解决方案资源管理器窗口中列出自动生成的文件(请读者注意比较与例1-1的不同)。

5)选择【视图】|【工具箱】菜单命令,在工具箱中拖动标签Label和按钮Button控件到设计器与编辑器窗口的表单Form1上,如图1-9所示。图1-9 表单Form1

6)选中表单Form1上的按钮控件Button1,按鼠标右键,在弹出的菜单中选择【属性】命令,在Button1的属性窗口中将Text属性改为“单击我”。

7)双击按钮控件Button1,Visual Studio自动生成按钮单击事件框架。如图1-10所示。图1-10 按钮单击事件框架

8)在编辑器窗口的空的button1_Click事件程序框架中添加代码如下:

label1.Text="HelloC#World!";

最终的程序如下:

9)选择【调试】|【启动调试】菜单命令(或按〈F5〉键)运行程序。运行结果如

图1-11所示。用鼠标单击按钮,将在标签所在位置显示“Hello!C# Worldꆡ”字样。

程序说明:

1)Windows应用程序导入的命名空间与控制台应用程序导入的命名空间有所不同。

2)button1_Click(object sender,EventArgs e)是按钮单击事件,它完成的事件过程是在标签label1上输出字符串“Hello!C#World”。图1-11 运行结果a)运行结果 b)单击按钮后的结果

3)Windows应用程序和控制台应用程序的基本结构类似,程序的执行总是从Main()方法开始,主函数Main()必须在一个类中。但Windows应用程序使用图形界面,一般有一个窗口(Form),采用事件驱动方式工作。创建一个Windows窗体应用程序后,在解决方案资源管理器窗口中即自动生成了Program.cs文件,该文件中包含了Main方法,其中的部分代码如下:

在这段代码中,Application类的Run()方法用于让窗体Forml显示出来。如果希望程序启动后显示的是另一个窗体,则可通过直接修改这条语句来实现。

1.4 C#应用程序的组织

在Visual Studio中,C#程序是通过解决方案中的项目来组织的。默认情况下,一个解决方案中只包含一个项目,解决方案名和项目名默认相同。实际的应用开发中,一个解决方案可能会包含多个项目。C#源文件的扩展名为.cs,一个C#源文件中一般只包含一个类,但也可以含多个类;文件名可以与类名相同,也可以不同。在Visual Studio调试环境下,项目编译后生成的文件默认保存在项目的bin\debug文件夹下。1.4.1 命名空间

C#语言程序可由一个或多个文件组成。每个文件都可以包含零个或零个以上的命名空间。一个命名空间除了可包含其他命名空间外,还可包含类、结构、接口、枚举、委托等类型(这部分内容将在本书的后面章节介绍)。要访问某个命名空间的类或对象,必须使用如下语法:

命名空间.类名

例如,Console类位于System命名空间中,所以当访问Console类时,完整的写法应是:System.Console,但如果已在程序中使用using语句导入了System命名空间,程序中就可以直接使用System命名空间中的类或对象。1.4.2 类

C#要求程序中每一个元素都属于某个类。也就是说C#程序包括至少一个自定义类。类的边界由“{”和“}”构成。类内可以嵌套另一个类。1.4.3 using关键字

using关键字在C#中有着如下作用:

1)用于为命名空间导入其他命名空间中定义的类。为了快速引用需要的功能,一般在程序的开头引用命名空间来简化代码表示形式。如果在程序的开头加上:

using System;

则:

System.Console.WriteLine("Hello World");就可以直接写为:

Console.WriteLine("Hello World");

2)用作别名指令,来简化命名空间的表达形式。除了指定引用的命名空间外,还可以使用using简化命名空间的层次表达形式,例如:

using System.Windows.Forms;可以表示为

using WinForm=System.Windows.Forms;这样一来,语句

System.Windows.Forms.MessageBox.Show("hello");就可以简写为:

WinForm.MessageBox.Show("hello");1.4.4 Main方法

C#程序采用一个名字为Main()的静态方法作为程序的入口点,程序控制在该方法中开始和结束。Main()方法必须在某个类的内部定义。

在C#程序中,Main()方法只能声明为public static int或者public static void。C#要求每一个方法都要有一个返回值,对于没有返回值的方法,则须用关键字void表明其返回值类型。

Main()方法可以放在任何一个类中,控制台应用程序和Windows程序默认将其放在Program.cs文件的Program类中。1.4.5 代码注释

为了提高程序可读性,C#程序采用两种注释:

● 以“//”开始的单行注释。

● 以“/∗”开始并以“∗/”结束的多行注释。1.4.6 通过断点调试程序

利用断点查找程序运行的逻辑错误,是调试程序常用的手段之一。

如果在某条语句前设置断点,则当程序执行到这条语句时会自动中断程序运行,进入调试状态(注意,此时还没执行该语句)。

在Visual Studio中,常采用如下方法设置和取消断点:

1)用鼠标单击某代码行左边的灰色区域。单击一次设置断点,再次单击取消断点。

2)用鼠标单击某代码行,直接按〈F9〉键设置或取消断点。

断点设置成功后,在对应代码行的左边会显示一个红色的实心圆标志,同时该行代码也会突出显示。断点可以有一个,也可以有多个。

设置断点后,即可运行程序。程序执行到断点所在的行,就会中断运行。需要注意的是,程序中断后,断点所在的行还没有执行。此时,如将鼠标放在变量或实例名的上面,调试器就会自动显示执行到断点时该变量的值或实例信息。观察以后,可以按〈F5〉键继续执行到下一个断点。

1.5 习题

1.简答题(1)简述C#语言的特点。(2)面向对象系统最突出的特点是什么?(3)C#语言程序主要由哪些部分组成?(4)在C#集成开发环境中主要有哪些窗口?它们的主要作用是什么?(5).NET框架的两个主要类库是什么?(6)变量、常量的命名规则有哪两种?2.选择题(1)在.NET中,( )技术实现跨语言互用性。

A.CLR B.CTS C.CLS D.CTT(2)下列标识符中,( )属于camelCase表示法。

A.LoginUserName B.gotoyou C.doSportAction D.Psychologytest(3)using namespace的作用是表示()。

A.使用一段程序 B.使用数据库 C.使用一个文件 D.引入命名空间(4)在.NET中,以下关于命名空间的描述正确的是( )。

A.命名空间不可以嵌套

B.任一个.cs文件中,只能存在一个命名空间

C.用private修饰的命名空间,其内部的类也不允许访问

D.命名空间使得代码结构清晰,更有条理(5)C#语言可以开发( )。

A.分布式组件 B.Web程序 C.网络数据库 D.Windows应用程序(6).NETframework平台开发的首选语言是( )。

A.C++ B.VB.NET C.C# D.Java

1.6 实训

(1)建立一个控制台应用程序,输出姓名、专业和班级。(2)建立一个Windows应用程序,要求单击按钮,在标签中输出“Windows应用程序”,字体大小为一号,字体颜色为蓝色,窗口标题为“Windows应用程序”。(3)建立一个Windows应用程序,在窗体上放置3个按钮和1个TextBox控件,将3个按钮的Text属性分别设置为“Red”“Blue”“Green”。编写程序实现通过单击不同的按钮使TextBox控件的背景色发生变化。

第2章 变量与表达式

本章要点

● C#的变量与常量

● C#的数据类型与类型转换

● C#的运算符与表达式

2.1 常量与变量

数据运算是程序设计的主要任务。C#包含丰富的数据类型用于各种运算。在C#程序中,不同类型的数据都必须遵守“先定义,后使用”的原则,即任何一个变量和数据都必须先定义其数据类型,然后才能使用。2.1.1 常量的声明

常量就是值在程序整个生命周期内始终不变的量,使用关键字const声明。在使用过程中,不可以对常量进行赋值的改变。常量声明的基本语法为:

[访问修饰符] const [类型标识符]常量名=value;

例如:

public const double PI=3.1415926;

const int DaysIn Year=365;

说明:语法表达式中采用方括号"[]",表示其中的内容是可选项。如采用逻辑或号"|",表示"|"两端的内容是或选项。2.1.2 变量的声明

在程序设计语言中,变量代表了存储单元。不同类型的变量在计算机内存中占有不同的空间。为此,需要为每个变量指定一个类型,以确定哪些值可以存储在该变量中。通常通过赋值语句的操作来改变变量的值。C#中,声明变量的一般语法是:

类型标识符 变量名;

类型标识符 变量名1,变量名2,变量名3,……;

例如,下面的语句声明了一些变量:

int myNumber; //声明整形变量myNumber

float sum; //声明浮点变量sum

char a; //声明字符变量a

string strName,strPassword; //声明了两个字符串变量strName和strPassword

也可以在声明变量的同时初始化变量,即为变量赋值(这是值得提倡的良好习惯)。其格式如下:

类型标识符 变量名=表达式;

例如:

double d=0.618; //声明了double型变量的同时将其初值设置为0.618

bool bl=true,D2=false; //声明了两个double型变量的同时为它们其设置初值

C#在变量声明时,变量的命名规则应该遵守一些基本规则:

● 变量名的长度不能超过255个字符。

● 变量名在有效的程序范围内必须是唯一的。

● 变量名不能是关键字(或称作保留字),但可以把关键字嵌入变量名。如非要使用时需在关键字前添加@作为前缀。

关键字是一种高级计算机程序设计语言中属于语言成分的特殊标识符,用户一般是不允许在程序中使用这些标识符定义各种名称的。C#的关键字请见表2-1。表2-1 C#的关键字

C#的所有的关键字都是小写字符。由于C#程序代码区分大小写,读者应注意这一点。按照C#变量的命名规则,下面的变量名是错误的:

123Name

class

student-name

除了按照基本的变量命名规则外,实际应用时,为了便于代码的维护和阅读还应该注意:

1)采用有实际意义的变量名,做到见其名知其意,如MySalary、studentAge、Number⁃OfBalls。

2)注意大小写的不同,如MyName、myName、myname分别代表了3个不同的变量名。

3)采用PascalCase或camelCase方式命名变量名(请见第1.5节)。2.1.3 变量的种类

C#中有多种变量类别,它们分别是:静态变量、实例变量、数组元素、局部变量、值参数、引用参数和输出参数。

带有static修饰符声明的变量是静态变量。不带有static修饰符声明的变量称为实例变量(非静态变量)。静态变量被赋值并且所属的类被装载后,将一直存在直到包含该类的程序运行结束。局部变量就是只在局部作用域里发生作用的变量,它的生效范围定义在它所在的代码块内。从它从开始声明的地方生效,当块结束后,局部变量也消失了。

例如下面的代码中声明了几种变量:

在上面的代码中使用了多种变量:x是实例变量,y是静态变量,s是数组变量,m是值参数,i是引用参数,j是输出参数,w是局部变量。

2.2 数据类型

在进行程序设计时,必须让计算机了解需要处理的是什么数据,以什么方式处理数据以及以什么方式保存数据和显示数据。为此,对程序中声明的每一个用于保存信息的变量,必须同时指明它的数据类型,以便编译器为它分配内存空间。C#的数据类型包括了值类型、引用类型和指针类型3种,如图2-1所示。指针类型只用于不安全模式,本书不做介绍。图2-1 C#的数据类型

值类型和引用类型之间的区别在于:值类型变量直接存储它的数据内容,当把一个值赋给一个值类型时,该值实际上被复制了;引用类型变量不存储实际数据内容,而是存储对实际数据的引用,当把一个值赋给一个引用类型时,仅仅是复制引用,实际的值仍然保留在原来的内存位置,只是赋值后有两个不同的变量指向这个实际的值。

C#中内置的基本数据类型见表2-2,这些类型是.NET框架System命名空间中预定义数据类型的别名。表2-2 基本数据类型注:变量名称前面的“u”是“unsigned”的缩写,表示不能在这些类型的变量中存储负号。2.2.1 值类型

所谓值类型,就是一种由类型的实际值表示的数据类型,C#的值类型可分为简单类型、枚举类型和结构类型3种。

1.简单类型

C#本身提供了一组已经定义好的简单类型。简单类型(Simple Types)包含了整数类型、实数类型、布尔类型和字符类型。(1)整数类型

整数类型是指其数据量的值是整数。C#语言中的整数分为8类,它们是:短字节型(sbyte)、字节型(byte)、短整形(short)、无符号短整形(ushort)、整形(int)、无符号整形(uint)、长整形(long)、无符号长整形(ulong)。这些不同的整数类型可以用于存储不同范围的数值,占用不同的内存空间。例如:

37 //代表int类型的数值37

578u //代表uint类型的数值578(2)实数类型

在C#中,实数类型是同时使用整数部分和小数部分来表示数值的类型。分为单精度(float)、双精度(double)和十进制(decimal)类型,它们的差别在于取值范围和精度不同。由于计算机对实数的运算速度大大低于对整数的运算,常常采用单精度型用于对精度要求不高的计算中,而对结果要求更为精确的运算采用双精度型。而decimal类型是适合财务和货币计算的128位数据类型。

实数类型都是有符号类型。如果某个变量可以包含小数,则将其声明为这些类型之一,可采用M(或者m)表示decimal,用F(或者f)表示float,用D(或者d)表示double。例如:

138f //代表float类型的数值138.0

32.5m //代表decimal类型的数值32.5

15.68d //代表double类型的数值15.68(3)布尔类型

在C#中,bool数据类型是被解释为True或False的无符号值。如果某个变量只能包含“是/否”或“真/假”信息,则将它声明为bool类型。可以将布尔值赋给布尔型变量,也可以将值为布尔类型的表达式赋给布尔型变量,例如:

boo1 var=true;

bool var=(v>0&&v<10);

bool var=(20>30);

bool var=(c==S);

需要指出,与某些其他语言不同,C#中,布尔型和其他类型之间不存在标准转换(如整型数的1和0)。布尔类型与整型是截然不同的,不能用布尔值代替整数值,反之亦然。(4)字符类型

字符类型char在C#中被看作是一种特殊的整数类型,用来处理Unicode字符。Unicode字符是16位字符,用于表示世界上大多数已知的书面语言。取值范围为0~65535。每个数值代表一个Unicode字符。

字符包括数字字符、英文字母、表达符号等。它们都采用Unicode字符编码。在使用字符常量时,必须用单引号。不包含任何字符的字符串,就称为空字符串。例如:

char myChar=′G′;

char yourChar=";

C#中提供了转义符,用来表示单引号和反斜杠等特殊的字符常数,在需要表示这些特殊常数的地方,可以使用这些转义符来替代字符,C#中常用的转义符如表2-3所示。表2-3 C#中常用的转义符

2.结构类型

计算机程序中,除了简单的数据类型外,往往需要一些更复杂的数据类型。在C#中,可以使用结构类型(Structure)把多个不同类型的数据组合到一起。结构类型可以声明常数、字段、方法、属性、索引器、操作符和嵌套类型。与使用类相比,使用结构类型的优点在于创建一些小型的对象时可以节省内存,并且不要求使用继承或引用标识。声明结构类型的语法如下:

例如,下面代码定义了一个用于表示圆的结构:

在C#的System命名空间中。有一个常用的结构类型DataTime,该结构定义了多个操纵时间的属性,可以直接显示具体的时间信息,同时还提供多个方法来处理时间信息。例如:

DateTimedt=DateTime.Now; //声明日期时间变量dt并初始化为当前时间

dt.ToString(); //将dt转化为字符串,结果为2009-11-813:21:25

dt.Date.ToShortDateString(); //将dt的Date成员转化为字符串,结果为2009-11-8

dt.ToLongTimeString(); //将dt的Time成员转化为字符串,结果为13:21:25

dt.Year.ToString(); //将dt的Year成员转化为字符串,结果为2009

dt.Month.ToString(); //将dt的Month成员转化为字符串,结果为11

dt.Day.ToString(); //将dt的Day成员转化为字符串,结果为8

dt.DayOfWeek(); //将dt的DayOfWeek成员转化为字符串,结果为Sunday

3.枚举类型

枚举(Enumeration)实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。当我们希望变量提取的是一个固定集合中的值时,就可以使用枚举。枚举元素的默认基础类型为int。默认情况下,第一个枚举元素的值为0,后面每个枚举元素的值依次递增l。定义枚举类型时必须使用enum关键字,使用语法如下:

enum枚举名

{枚举成员表}[;]

例如:

enum WeekDay{Sun,Mon,Tue,Wed,Thu,Fri,Sat}

在此枚举中,Sun的值为0,Mon为1,Tue为2,依此类推。也可以直接给枚举元素赋值来改变这种默认情况,而且不同元素的值可以相同。2.3.2 引用类型

引用类型(Reference)又称为对象。引用类型是不直接存储变量值的,存储的实际上是引用值的地址。实际使用时,引用也可以是null,这表示它当前不引用或不指向任何对象。C#的引用类型有4种:类(class)、数组(array)、委托(delegate)和接口(inter⁃face)。这里简要介绍类类型里常用的两个类:object类、string类,以及数组,其余的将在后面再进行详细介绍。

1.object类

object类是C#中所有类的基类,其他的类都是由object类直接或间接派生出来的。因此,对于任一个object变量,均可以赋以任何类型的值。例如:

int sum=8; //声明一个整形变量sum并初始化

double numb=12.3d //声明一个双精度变量numb并初始化

object myObj1,myObj2; //声明两个object变量myObj1和myObj2

myObj1=sum; //将整形变量sum赋给object变量

myObj2=numb; //将双精度变量numb赋给object变量

2.string类

string类专门用于对字符串进行操作。一个字符串是被双引号包含的一系列字符。在实际应用中,字符串使用的非常广泛,字符串之间的运算也很方便。例如:

string strl="你好!"; //声明一个字符串变量str1并初始化

string str2="C#。"; //声明一个字符串变量str2并初始化

string str3=strl+str2; //str3的结果是“你好!C#。”

char c=str3[0]; //取出str3的第一个字符,即“你”

3.数组类型

数组(Array)代表一组相同类型变量的集合,其中的每一个变量称为数组的元素。数组元素可以为任意类型,包括数组类型。C#中支持的数组包括:一维数组,多维数组(矩形数组)和数组的数组(交错数组)。对数组元素的访问是通过数组下标来实现的。C#数组的下标从0开始,即第一个元素对应的下标是0,以后元素逐个递增。C#声明数组的方法是在类型后面放一对空的方括号,然后加上数组名:

类型标识符[] 数组名;

数组在被访问之前必须初始化,初始化有如下两种方式。

1)由字面形式指定数组的完整内容,例如:

int[]numbers={1,2,3,4,5};

2)使用关键字new,先直接指定数组的大小,再初始化所有数组元素,例如:

int[]numbers=new int[5]{l,2,3,4,5};

前面介绍的字符串类型,在计算机里存储时,实际上是按单个字符的方式连续组成起来的,其实质就是字符数组。可以将其理解为一连串顺序存储的字符。

2.3 数据类型转换

类型转换是相对数据类型而言的,就是不同数据类型之间的转换。C#的数据类型转换分为隐式转换和显式转换。显式(强制)转换就是强制将高精度数值转换为低精度数值,使用显式转换时,必须指明转换目标类型。2.3.1 隐式转换

隐式转换就是将低精度数值转换为高精度数值,转换顺序见图2-4。若两种变量的类型是兼容的或者目标类型的取值范围大于源类型时,此时类型转换就由系统自动完成。例如:

int a=100; //声明整形变量并初始化

float b=a; //整形变量隐式转换为浮点型变量表2-4 隐式转换的源类型与目标类型对应表2.3.2 显式转换

在不能满足隐式转换的情况下,必须使用显式(强制)类型转换。显式类型转换是一种指令,它告诉编译器将一种类型转换为另外一种类型。

1.使用显式转换

显式转换的语法格式是:(目标类型)变量或表达式;

例如:

int a=80; //声明整形变量并初始化

short b=(short)a; //将整形强制转换为短整型

char c=(char)a; //将整形强制转换为字符型

2.使用Convert类

C#的Convert类提供了很多的方法来进行显式(强制)类型转换,其语法格式是:

目标类型=Convert.转换方法(源类型);

例如:

int myNum; //声明整形变量

myNum=Convert.ToInt16("120"); //将字符串"120"强制转换为整形并赋值

3.使用ToString()方法

ToString()方法主要用于将某些类型的变量转化为字符串类型,是C#中非常常见的一个方法。其语法格式是:

变量名.ToString();

例如:

int myNum=100; //声明整形变量并初始化

sting s=myNum.ToString(); //声明字符变量,将整形强制转换为字符型并赋值

这样字符串类型变量s的值就成为“100”。

4.使用Parse()方法

Parse()方法可以将特定格式的字符串转换为数值。其语法格式是:

数值类型名.Parse(字符串型表达式);

其中,“字符串型表达式”的值必须严格符合“数据类型名”对数值格式的要求。例如:

intx=int.Parse("789"); //符合整型格式要求,转换成功

intz=int.Parse("789.1"); //不符合整型格式要求,转换失败2.3.3 装箱与拆箱

在C#中,使用装箱与拆箱可以完成值类型和引用类型之间的转换,它使值类型能够被视为对象。装箱转换允许将值类型隐式转换为引用类型。实际上装箱的工作过程是:首先分配一个对象实例,然后将值类型的值复制到该实例中。拆箱转换允许将引用类型显式转换为值类型。拆箱也包括两个步骤:首先检查对象实例是否为给定值类型一个装了箱的值,然后将该值从实例中复制出来。完成装箱和取消装箱的操作的例子如下:

inta,b=2000; //声明两个整形变量并初始化

object obj=b; //装箱

a=(int)obj; //取消装箱

Console.WriteLine(100.ToString()); //把值类型视为对象,使用object的ToString成员【例2-1】在程序中执行装箱转换。

在Visual Studio中创建控制台应用程序项目“BoxingTest”,并编写程序代码:

程序运行结果见图2-2。图2-2 程序运行结果

在本例的WriteLine()方法中,采用了“{N[,M][:格式化字符串]}”的形式来格式化输出字符串,其中的参数含义如下:

● 花括号“{}”用来在输出字符串中插入变量。

● N表示输出变量的序号,从0开始,如当N为0时,则对应输出第1个变量的值,当N为1时,则对应输出第2个变量的值,依次类推。

● [,M]为可选项,表示输出的变量所占的字符个数,如M取值为负数时,输出的变量按照左对齐方式排列;如M取值为正数时,

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载