第1章 C#、.NET和Visual Studio简介
2000年6月,Microsoft正式发布了一种全新的软件开发平台——Microsoft.NETF ramework(.NET框架),旨在提供一种创建和运行下一代应用程序和Web服务的新方式。Visual C#(简称为C#)是专门为.NET Framework开发的程序设计语言,它借鉴了Delphi、C++及Java的语法及主要功能,是一种类型安全的面向对象通用语言,可用于编写任何类型的应用程序。
Visual Studio是Microsoft推出的一套完整的、基于.NET Framework的应用程序开发工具集。本书所讲解的版本为Visual Studio 2015,内置最高.NET Framework版本为4.6.1,默认使用的.NET Framework版本为4.5.2。同时提供对.NET Framework 2.0、.NET Framework 3.0等版本的支持。使用Visual Studio 2015可以方便地进行Windows、ASP.NET Web和移动端等各类应用程序的开发。
本书使用Visual Studio 2015 Enterprise Update 3和Windows 10专业版作为写作背景,但讲述内容除特别声明外也适用于Visual Studio 2008及以上各版本。
1.1 .NET Framework
.NET Framework提供了一些工具和技术,使得开发人员能够以独立于语言和平台的方式创建、调试和运行应用程序或Web服务,它提供了庞大的类库,用来以简单、高效的方式提供对众多常见业务的支持。
1.1.1 公共语言运行时(CLR)
公共语言运行时(Common Language Runtime,CLR)是所有.NET应用程序运行所必需的环境支持,是所有.NET应用程序的编程基础。可以将CLR看作是一个在执行.NET应用程序时,代码的“管理者”。通常将能够被.NET Framework管理的代码称为“托管代码”(Managed Code),反之称为“非托管代码”(Unmanaged Code)。
CLR主要包含有通用类型系统(CTS)、公共语言规范(CLS)、微软中间语言(MSIL)、虚拟执行系统(VES)、内存管理和垃圾回收等模块。
1.通用类型系统(CTS)和公共语言规范(CLS)
通用类型系统(Common Type System,CTS)可以使所有基于.NET的程序设计语言(如C#、Visual Basic等)共享相同的类型定义,从而让这些使用不同语言编写的应用程序使用一致的方式操作这些类型。
由于CTS要兼容于不同语言编写的应用程序,所以它需要使用独立于任何一种编程语言的方式来定义类型,并且需要兼顾不同编程语言之间的差异。为此,CTS提供了一个所有.NET语言都必须遵守的、最基本的规则集,称为“公共语言规范”(Common Language Specification,CLS)。
2.微软中间语言(MSIL)和虚拟执行系统(VES)
CTS和CLS解决了独立于编程语言的问题,使程序开发人员可以自由地选择自己熟悉的编程语言,甚至可以实现在同一个应用程序项目中使用不同的编程语言进行开发。但如果编译器生成的可执行代码不能摆脱对硬件的依赖,则上述优势将消失殆尽。为了解决这一问题,.NET Framework在编译托管代码时,并未直接生成可执行的目标代码(本机代码),而是将其编译成一种类似于汇编语言的、能兼容不同硬件环境的通用中间语言(Microsoft Intermediate Language,MSIL)表示的代码。
虚拟执行系统(Virtual Execution System,VES)也称为“托管运行环境”,它是CLR的一个重要组成部分,负责处理应用程序所需要的低级核心服务。.NET应用程序启动时,由VES负责加载并执行MSIL代码,由“虚拟执行系统”提供的“即时编译器”(Just-In-Time,JIT)在程序运行阶段将MSIL转换成本计算机代码。
3.内存管理
内存管理主要是为应用程序运行分配必要的计算机内存空间,定期回收不再使用的内存空间。在许多早期的编程语言中,这一直都是一个很麻烦的问题,稍有不慎就可能导致程序运行错误。在这些编程语言中,开发人员需要考虑如何在恰当的时间,合理地分配或回收计算机内存,以保证整个系统的正常运行。而在.NET中这项工作交由VES自动完成,一般情况下无须开发人员干预。这种机制提高了应用程序的稳定性,开发人员可以将关注点集中在应用程序所需的业务逻辑设计上,提高了开发效率。
1.1.2 .NET Framework类库
.NET Framework类库(Framework Class Library,FCL)是系统预设的、经过编译的、用于实现一些常用功能的程序模块集合。程序员在开发过程中只需简单地调用其中的某些类,即可实现希望的操作,而不必关心该操作是如何实现的。.NET Framework类对用户来说就像一个“黑匣子”,输入原始数据或请求即可得到加工处理后的数据或实现某种操作,而不必关心黑匣子内部发生了什么。
目前,FCL中包含4000多个公有类,是当今最大的类库之一。数量众多、功能强大的类库使.NET Framework具有了将复杂问题简单化的特征,极大地提高了应用程序的运行稳定性和开发效率。
在FCL中使用“命名空间”(Name Space)将数量众多、功能各异的.NET类划分为不同的层次。命名空间使用点分式语法表示该层次结构(每层之间使用符号“.”进行分隔)。例如,System.Data.SqlClient表示SqlClient隶属于Data,而Data又隶属于System。为了减少程序代码的输入量,可以在项目的代码窗口最上方使用using语句添加对所需命名空间的引用。图1-1所示为新建一个Windows窗体项目后,由系统自动添加到项目中的命名空间引用代码。灰色显示的部分表示已添加但并未使用的命名空间引用。
图1-1 引用命名空间
1.1.3 C#项目与.NET Framework的关系
C#项目与.NET Framework之间的关系如图1-2所示。
可以看出,C#程序需要在.NET Framework上运行,用C#语言编写的源代码首先要被编译成MSIL中间语言。中间语言代码和资源(位图、字符串等)以“程序集”(可执行文件,扩展名通常为exe或dll)的形式保存在磁盘中。
当执行C#程序时,程序集将被加载到CLR中,如果程序集满足安全要求,CLR会直接执行即时编译(JIT),将MSIL代码转换成本机指令。此外,CLR还提供与自动垃圾回收、异常处理和资源管理相关的一些服务。
图1-2 C#项目与.NET Framework之间的关系
由于C#编译器生成的中间语言代码符合通用类型系统(CTS),因此由C#生成的中间语言代码可以与Visua lBasic、Visual C++等符合CTS的、20多种基于.NET Framework的编程语言生成的代码进行交互。这就使得一个程序集中可能包含多个用不同语言编写的、符合CTS规范的模块,并且其中包含的类型也可以相互引用,就像是用同一种语言编写的一样。这一特征被称为“语言互操作性”,是.NET Framework的一项重要功能。
1.2 Visual Studio项目管理
Visual Studio是Microsoft专门为.NET Framework设计的开发平台,它将程序设计中需要的各个环节(程序组织、界面设计、程序设计、运行和调试等)集成在同一个窗口中,极大地方便了开发人员的设计工作。通常将这种集多项功能于一身的开发平台称为“集成开发环境”(Integrated Development Environment,IDE)。
1.2.1 新建和打开项目
在Visual Studio中,一个完整的应用系统可能会包含在若干个“项目”中,与应用系统相关的所有项目集合被称为“解决方案”。创建一个Windows应用程序,首先需要在Visual Studio环境中创建一个新项目。
1.新建和保存项目
启动Visual Studio后首先显示如图1-3所示的“起始页”内容,如在“开始”选项组中单击“新建项目”链接,将弹出如图1-4所示的“新建项目”对话框,选择Visual C#模板下的“Windows窗体应用程序”选项,选择使用的.NET Framework版本(默认为.NET 4.5.2,最高支持.NET 4.6.1,同时提供对.NET 2.0和.NET 3.0的支持),并指定项目名称、保存位置及解决方案名称,然后单击“确定”按钮,系统将根据用户设置自动创建一个“空白”的Windows窗体应用程序框架。
创建好一个Visual C#项目后,用户可以在IDE环境中完成界面设计、代码编写和运行调试等。需要保存项目文件时,可单击Visual Studio工具栏中的“全部保存”按钮 ,或选择“文件”→“全部保存”命令或按〈Ctrl+Shift+S〉组合键。
图1-3 Visual Stutio起始页
图1-4 “新建项目”对话框
此外,在关闭Visual Studio时系统会检查当前项目中是否有尚未保存的文件,若有,则弹出如图1-5所示的对话框,询问用户是否要保存更改。
“项目”(Project,也称为“工程”)是Visual Studio用来标识构建应用程序的方式。它作为一个容器对程序的源代码和相关资源文件进行统一管理和组织,项目文件是*.csproj(C#)或*.vbproj(Visual Basic)。
在Visual Studio中创建一个项目时,系统会自动创建相应的“解决方案”(Solution),解决方案文件默认与项目同名,其扩展名为sln。需要注意的是,一个解决方案中可以包含多个项目,可以将解决方案理解为“项目的容器”,将项目理解为“程序的容器”。
图1-5 保存项目文件
2.打开项目
在Visual Studio中创建一个项目时,系统会自动将项目包含到一个解决方案中,并默认为解决方案创建一个文件夹,解决方案文件(*.sln)就存放在该文件夹内。
可以通过以下几种途径打开已创建的项目。
1)在“起始页”的“开始”选项组中单击“打开项目”链接,在弹出的对话框中选择解决方案文件(*.sln)将其打开。
2)通过在Windows操作系统的“计算机”或“资源管理器”窗口中直接双击保存在解决方案文件夹中的*.sln文件将其打开。
3)最近使用过的项目会出现在“起始页”的“最近”选项组中,单击其名称可再次打开到Visual Studio集成开发环境中。
1.2.2 集成开发环境中的主要子窗口
创建了一个新项目后,系统进入如图1-6所示的Visual Studio集成开发环境主界面。从图中可以看到除了具有菜单栏、工具栏外,还包含许多子窗口,其中最常用的是“工具箱”“解决方案资源管理器”“属性”和“输出”窗口。
用户的主要工作区域是“窗体设计器”,该窗口用来显示Windows窗体的“设计”视图(“Form1.cs[设计]”选项卡)或程序的“代码窗口”(Form1.cs选项卡)。其他更多用于管理项目、调试程序等的子窗口,都可以通过在“视图”菜单中选择相应的命令将其打开。
图1-6 Visual Studio 2015集成开发环境
在Visual Studio集成开发环境中,有两类子窗口,一类是在窗体设计器中显示的窗口,如“起始页”“代码窗口”和“设计”视图等;另一类是在窗体设计器周围显示的子窗口,如“工具箱”“解决方案资源管理器”“服务器资源管理器”“属性”“输出”和“错误列表”等。
1.解决方案资源管理器
使用Visual Studio开发的应用系统称为一个解决方案,每一个解决方案可以包含一个或多个项目。一个项目通常是一个完整的程序模块或类模块,其中可能包含若干个文件。
“解决方案资源管理器”子窗口中显示了Visual Studio解决方案的树形结构,单击项目名称前面的空心或实心三角标记可以使该项展开或折叠。
如图1-7所示,在“解决方案资源管理器”窗口中可以像Windows资源管理器那样,浏览组成解决方案的所有项目和每个项目中的文件,可以对解决方案的各元素进行各种操作,如打开文件、添加内容、重命名和删除等。在“解决方案资源管理器”窗口中双击某个文件,将在主窗口中显示相应的视图(设计视图或代码窗口),以便对该文件进行编辑。
2.“属性”窗口
“属性”窗口用于设置解决方案中各对象的属性,当选择Windows窗体的设计视图、项目名称或类视图中的某一项时,“属性”窗口将以两列表格的形式显示该子项的所有属性。图1-8所示为在窗体设计器中选择了窗体控件Form1时显示的属性内容。
在“属性”窗口中,左边显示的是属性名称,右边显示的是对应各属性的属性值。选择某一名称后,可以在右边修改该属性值。例如,若希望修改在窗体的标题栏中显示的文字,可直接在“属性”窗口中修改其Text属性值。
在“属性”窗口的上方有一个下拉列表框,用于显示当前选定的对象名称及所属类型(如本例中Form1为对象名称,System.Windows.Forms.Form为对象的类型)。可以在该下拉列表框选择窗体中包含的其他对象。
如果选择的是窗体中的控件对象,在窗体的设计视图中,被选择对象会自动处于选定状态(四周出现8个控制点),原来选定的对象将取消选定。
属性名称默认按字母顺序排列,单击窗口中的“字母排序”按钮 与“分类排序”按钮 ,可以在两种排序方式之间切换。
选择设计视图中的窗体或窗体中的某控件,并在“属性”窗口中单击“事件”按钮 ,“属性”窗口中将显示被选择窗体或控件支持的所有事件列表,如图1-9所示。
图1-7 解决方案资源管理器
图1-8 Form1的“属性”窗口
图1-9 文本框控件的事件列表
双击某一事件名称,将自动打开代码窗口,并添加该事件处理程序的声明,用户可在其中填入处理响应事件的程序代码。
“属性”窗口的最下方有一个属性或事件功能的说明区域,当选择某一属性或事件时,说明区域会显示文字说明属性或事件的作用,这对初学者而言很有用。如果该区域没有显示,可将鼠标指向窗口列表框的下部边框,当鼠标指针变为双向箭头时向上拖动鼠标,该区域即可显示出来。
在事件子窗口中单击标题栏中的“属性”按钮 ,可返回“属性”窗口。
3.工具箱
Visual Studio工具箱中存放了众多系统预定义的、用于组成应用程序界面的“控件”,如文本框(TextBox)、按钮(Button)和标签(Label)等。
默认状态下,工具箱处于“自动隐藏”状态,窗口的左边框处显示有工具箱的选项卡标签。当鼠标指向该标签时,工具箱将显示到屏幕中。
工具箱用于向应用程序窗体中添加控件以构成应用程序的基本界面。利用工具箱使程序员可以像“拼图”一样,简单地设计程序界面。
如图1-10和图1-11所示,Visual Studio将控件放在不同的分类中,各分类卡以空心三角符号表示折叠状态,以实心三角符号表示展开状态。默认情况下工具箱中的控件以名称的字母顺序排列,以方便用户查找控件。需要说明的是,工具箱中的内容只有在进入窗体设计视图时才会显示出来。
如果进入了窗体的设计视图,工具箱仍没有出现在Visual Studio的IDE环境中,可选择“视图”→“工具箱”命令将其打开。
图1-10 公共控件
用户不但可以从工具箱中选择控件并将其拖动到窗体中,还可以将某一代码片断拖动到工具箱中暂存,以便将来重新使用。例如,可以将按钮(Button)控件从工具箱中拖放到窗体设计视图中,即向窗体中添加控件。也可从代码窗口中选择并拖出一个代码片段到工具箱中,待将来需要重复使用该代码段时,将其拖回代码窗口的适当位置即可。
4.集成开发环境中子窗口的操作
如果在窗体设计器中显示的窗体或代码子窗口不止一个,则它们将会以选项卡的形式显示在窗体设计器的标题栏中,可以通过单击相应的选项卡标签进行切换。在这些选项卡的右侧都有一个“关闭”按钮 ,用于关闭该子窗口。被关闭的子窗口,可在解决方案资源管理器中通过双击对应文件的方法将其再次打开。
所有子窗口的标题栏右侧都有3个操作按钮,一个“下拉菜单”按钮 、一个“关闭”按钮 和一个“图钉”按钮 。下拉菜单按钮中提供了一些关于操作子窗口的菜单项,如“停靠”“浮动”和“隐藏”等。关闭按钮用于关闭窗口,而图钉按钮用于决定窗口的隐藏与显示状态,在显示状态下又分为停靠显示与浮动显示两种方式。
图1-11 工具箱中控件分类
当图钉 为横向时,窗口为自动隐藏状态,这时窗口以标签形式显示在Visual Studio的左、右、下边框上。单击标签后窗口才会显示,单击窗口以外其他位置,则窗口又重新隐藏。
当图钉 为纵向时,窗口为固定显示状态,默认为停靠方式,即窗口附着在Visual Studio的左、右、下边框上。这时将鼠标指向窗口的标题栏并拖动鼠标,使窗口离开边框,窗口即为浮动显示方式,这时标题栏上的图钉按钮将消失。如要使浮动方式变为停靠方式,只需拖动窗口至Visual Studio主窗口的边框上即可。
1.2.3 Visual Studio的帮助系统
Visual Studio是一个非常庞大的应用程序开发系统,其中涉及的概念、语法及函数自然很多,这使得程序员在工作时很难将需要的知识点准确无误地完全记忆下来。为了解决这一问题,Visual Studio提供了一个完备的帮助系统。在Visual StudioIDE中,可以使用F1帮助、智能感知和MSDN资源等多种途径获取相关帮助信息。
1.智能感知
在代码编写过程中,Visual Studio提供了“智能感知”的帮助方式。利用这种帮助方式不仅可以提高代码输入效率,更重要的是避免了用户的输入错误。
(1)提示类、方法或对象名
在设计代码的过程中,当输入类名或对象名时,Visual Studio会动态提供当前可用的类及对象列表,如图1-12所示。如果选择某一列表项,则在其右侧动态显示出简要说明。用户可通过双击某列表项完成自动输入,也可以用键盘的〈↑〉〈↓〉方向键选择所需选项后按〈Enter〉键。
图1-12 提示类名或对象名
C#代码是区分大小写的,使用智能提示就可以不用关心这一问题。例如,希望输入的类名称是MessageBox,在输入时可以不考虑大小写直接输入首字母m,通过观察提示列表中是否出现了希望的方法名以决定是否继续输入后续字母“e”。
(2)提示类成员或对象成员
希望的类或对象名已出现在智能感知列表中,且已成为当前选中项,若此时需要继续输入类或对象成员时,可直接输入“.”号,系统将进一步提供新的可选项列表。例如,希望调用MessageBox类的Show方法显示一个提示信息框,则输入类的前两个字母me后,类名MessageBox成为当前选中项,此时直接输入“.”号,智能感知首先自动输入类名MessageBox,而后动态显示该对象所具有的3个静态成员,如图1-13所示,再输入Show方法的首字母s后,该方法成为当前选中项。方法名右侧显示的是Show方法的语法格式提示。
需要特别注意的是,如果输入“.”号后没有出现正确的成员列表,很有可能是出现了输入错误。
图1-13 显示类成员列表
(3)提示方法的参数说明
当使用类的静态方法或成员方法时,Visual Studio动态显示该方法的功能、不同用法(重载)及每种用法的参数说明。如图1-14所示,通过智能提示输入了MessageBox.Show后,输入后续的前括号“(”,系统将自动补全后括号“)”,并显示方法的第1个(共21个)参数书写格式。单击列表框中的“向下”按钮▼、“向上”按钮▲或使用键盘上的〈↓〉、〈↑〉键,可依次显示每种格式的具体用法和参数的类型及含义。
图1-14 提示方法的语法格式及重载
(4)拼写检查
实时进行语法、关键字的拼写检查是智能提示的另一个十分有用的功能。用户在输入代码时若出现了拼写或格式错误,系统将以红色下画波浪线、绿色下画波浪线等形式给出提示。红色表示错误,绿色表示不严谨。用鼠标指向出现下画波浪线的地方,系统将显示详细的说明信息。
2.MSDNLi brary帮助系统
MSDN Library(https://msdn.microsoft.com,以下简称MSDN)提供了所有Microsoft产品(Windows、Office和Visual Studio等)的文档资料,关于Visual Studio的帮助文档仅是其中一部分。它包括了众多编程技术信息和大量的示例代码,当遇到问题时可以随时查阅。
在Visual Studio界面中选择“帮助”→“查看帮助”命令,将打开如图1-15所示的关于Visual Studio的MSDN帮助网站。用户可通过左侧导航栏或右上角的搜索按钮查找需要的信息。
3.F1帮助
F1帮助也称为“上下文帮助”,可用于获取窗体设计器中的控件、代码窗口中的关键字和“属性”窗口中的属性等对象的帮助信息。使用时需要首先选中需要获取帮助信息的对象或将插入点光标定位到代码的关键字中后按〈F1〉键,系统将自动在MSDN中搜索,并将找到的相关帮助信息显示到屏幕中。
图1-15 MSDN在线之Visual Studio 2015
1.3 创建简单Windows应用程序
在Visua lStudio中创建一个简单Windows应用程序,一般需要经过以下6个步骤。
1)根据用户需求进行问题分析,构思出合理的程序设计思路。
2)创建一个新的Windows应用程序项目。
3)设计应用程序界面。
4)设置窗体中所有控件对象的初始属性值。
5)编写用于响应系统事件或用户事件的代码。
6)试运行并调试程序,纠正存在的错误,调整程序界面,提高容错能力和操作的便捷性,使程序更符合用户的操作习惯。通常将这一过程称为提高程序的“友好性”。
本节将通过一个简单加法计算器的创建过程,介绍在Visual Studio环境中使用C#语言创建Windows应用程序的基本步骤。
1.3.1 设计要求和设计方法分析
1.设计要求
要求在Visual Studio环境中设计一个Windows应用程序,程序启动后窗体中显示如图1-16所示的简单加法计算器界面。用户分别在2个文本框中输入数字后单击“=”按钮,在第3个文本框中将显示计算结果,如图1-17所示。
图1-16 程序界面
图1-17 简单加法计算器
2.设计方法分析
1)程序界面由3个文本框、1个标签和1个按钮控件组成,文本框用于接收用户输入的2个操作数和输入计算结果,标签和按钮用于显示组成算式的“+”和“=”。
2)用户单击“=”按钮时触发按钮控件的Click事件,在事件处理程序中编写代码将用户输入的2个操作数相加,并将所得结果显示到第3个文本框中。
1.3.2 创建项目和设计界面
启动Visual Studio后,在“起始页”中单击“开始”选项组中的“新建项目”链接,在弹出的对话框中选择“Visual C#”下的“Windows窗体应用程序”选项,在指定了项目名称、解决方案名称和保存位置后单击“确定”按钮,进入Visual Studio集成开发环境。
新项目创建后,系统会自动创建一个空白Windows窗体,程序员可根据实际需要从工具箱向其中添加其他必要的控件,以构成希望的程序界面。
通常可以通过以下两种途径在设计时向窗体中添加控件。
●双击工具箱中的某个控件图标。
●直接从工具箱拖动某图标到窗体上。
本例需要向窗体中添加3个文本框(TextBox)、1个标签(Label)和1个按钮(Button)控件。
1.调整控件的大小和位置
(1)调整控件大小
添加到窗体的控件有默认的大小和放置位置,但往往不能恰好满足界面设计的需要。希望调整大小时可首先单击控件将其选中,被选中的控件四周会出现8个控制点,拖动任一个控制点即可更改控件的大小,也可通过设置控件的Size属性值来精确指定控件的大小。本例中需要以比例恰当、美观为原则,将窗体、文本框和按钮的大小进行适当调整。标签控件默认其AutoSize属性为True,故能自动伸缩匹配Text属性值的长度,其大小无须调整。
(2)调整控件位置
调整控件位置最简单的方法就是使用鼠标直接将其拖动到希望的位置,也可通过设置控件的Location属性值来精确指定控件的位置。
2.控件对齐
如果窗体中包含有众多控件,为了界面的美观自然存在一个对齐的问题。Visual Studio提供了一个如图1-18所示的专门用于设置控件对齐方式的“布局”工具栏,用户可以在配合〈Ctrl〉键选择了多个控件后,单击其中某按钮来快速实现控件的对齐、间距设置等操作。用户将鼠标指向工具栏中的某个按钮时,屏幕上将显示其功能的提示信息。
图1-18 “布局”工具栏
如果“布局”工具栏没有显示出来,可在Visual Studio工具栏的空白处右击,在弹出的快捷菜单中选择“布局”命令。“布局”工具栏提供的功能也可以通过在Visual Studio中选择“格式”菜单中的相关命令来实现。
在窗体中拖动控件来改变其位置时,系统会自动显示出布局参考线来协助完成相邻控件的对齐设置。图1-19所示为在拖动标签控件时自动显示出来的对齐参考线。
图1-19 对齐参考线
1.3.3 设置对象属性
在面向对象的程序设计中,将控件或其他实体统称为对象,而对象的外观特征表现则需要通过对象的属性值来表现。在Visual Studio中可以通过“属性”窗口在程序设计时设置对象的属性,也可以编写代码在程序运行时设置对象的属性。
1.在“属性”窗口中设置属性
“属性”窗口用来设置对象的初始属性,在窗体中选择了某对象后,“属性”窗口将自动列出该对象的属性名称及默认值列表,程序员只需为某属性设置或选择新的属性值即可。
本例中使用了3个文本框,它们默认的Name属性值分别为textBox1、textBox2和textBox3;使用了1个标签控件和1个按钮控件,其默认Name属性值分别为label1和button1。本例要求参照表1-1所示设置各控件的初始属性。
表1-1 设置控件的初始属性
将控件的Name属性设置成易于理解的名称不是必需的,但当窗体中存在较多控件时,这种设置方法对提高代码的可读性很有帮助,是一种良好的编程习惯。通用的命名方法是使用控件类型标识结合能表现其作用的单词或缩写。例如,txtNum1中的txt表示这是一个文本框,Num1表示第一个操作数;btnResult中的btn表示这是一个按钮控件,Result表示用于显示计算结果。
2.通过代码设置属性
有些对象的属性在程序设计时并不是确定的,可能还需要根据程序运行情况动态地进行修改,对于这类属性,只能通过编写代码在程序运行时进行设置。通过代码设置对象属性值的语法格式如下。
对象名.属性名=属性值;
本例在窗体装入事件中使用下列语句在窗体标题栏中显示“简单加法计算器”。
this.Text="简单加法计算器"; //为窗体的Text属性赋值,C#语句要以“;”结束
1.3.4 编写代码和调试程序
面向对象的程序设计方法采用了“事件驱动”的代码编写方式,也就是将特定功能的代码片段放置在不同的事件过程中,只有触发了对应的系统事件(由系统触发的事件,如窗体装入等)或用户事件(由用户操作触发的事件,如单击按钮等)时,这些代码才会被执行。
Visual Studio中多数控件都被预定义有若干事件,例如按钮控件Button的Click事件(用户单击了按钮时触发);文本框控件TextBox的TextChange事件(用户更改了文本框中的文字时触发);窗体的Load事件(应用程序启动,窗体被装入时触发)。
本例中需要编写两个事件的处理程序代码。
1)在窗体加载时设置窗体的标题属性值“简单加法计算器”。
2)在按钮被单击时计算结果值并输出。
图1-20 由系统自动创建的事件过程框架
具体操作方法如下。
在设计视图中双击窗体,系统将自动切换到代码视图,并创建如图1-20所示的窗体默认事件(Form1_Load)的框架,程序员只需在该框架中编写相应的代码即可。同样道理,如果在设计视图中双击按钮控件,系统也将自动创建其默认事件(btnEqual_Click)的框架。
需要说明的是,代码中“//”后面的部分为注释内容,用于对代码的含义加以说明和解释,不会被程序执行。本例中需要编写的各事件的处理程序代码如下。
窗体装入时执行的事件处理程序代码如下。
C#是一种强类型的编程语言,要求运算时变量的类型必须相同。例如,本例中用户输入到文本框中的数字是字符串类型,没有大小的概念,仅表示一些符号的组合(如电话号码、身份证号码等),不能进行数学运算。所以需要将其转换成float浮点类型数据(数值型)后,才能进行求和运算。同样道理,计算结果是float类型,自然不能直接被文本框的字符串类型属性Text接受,所以需要将其转换成string(字符串)类型后,才能被输出到文本框中。关于C#的数据类型及转换将在第2章中详细介绍。
用于响应各类事件的代码编写完毕后,可单击工具栏中的“运行”按钮 或按〈F5〉键运行程序,并在txtNum1、txtNum2中输入一组数据后单击“=”按钮,观察并验证输出结果是否正确。在程序试运行、调试阶段要充分考虑用户操作可能出现的各种情况,尽可能提高程序的容错能力,提高程序的“友好性”。
1.4 实训 设计应用程序界面
1.4.1 实训目的
了解C#集成开发环境中各窗口的作用及使用方法,熟练掌握在Visual Studio环境中创建项目、保存文件及打开项目的方法;熟练掌握控件工具箱、窗体设计器和“属性”窗口的使用方法;熟练掌握使用“属性”窗口设置对象属性的操作过程;熟练掌握“格式”菜单或“布局”工具栏中“对齐”“使大小相同”“水平间距”和“垂直间距”等控件布局功能,能够快速创建美观、大方的应用程序界面。
1.4.2 实训要求
在C#的集成开发环境中,使用窗体设计器、控件工具箱及“属性”窗口创建如图1-21所示的应用程序登录界面。
具体要求如下。
1)窗体不显示“最小化”和“最大化”按钮,且窗体大小不能改变。
2)程序标题“软件学院教学管理”要相对窗体居中显示。
3)输入到“密码”文本框中的任何字符均以“*”号显示。
4)单击“重置”按钮时能清除上次输入的所有数据。
图1-21 程序界面
1.4.3 实训步骤
1.创建应用程序项目
启动Visual Studio后在“起始页”中单击“开始”选项组中的“新建项目”链接,在弹出的对话框中选择“模板”类型为“Visual C#”,在项目类型列表中选择“Windows窗体应用程序”选项,在对话框上方的下拉列表框中选择希望使用.NET Framework版本(Visual Studio 2015默认为.NET Framework4.5.2),在对话框下方为项目和解决方案命名,并指定相关文件的保存位置后,单击“确定”按钮完成项目创建,进入Visual Studio集成开发环境。
2.设计程序界面
设计步骤如下。
1)在窗体的设计视图中,通过控件工具箱向窗体添加2个标签label1、label2和1个文本框控件textBox1,按如图1-22所示适当调整窗体和各控件的大小及位置。label1用于显示标题文字“软件学院教学管理”,label2用于显示文本框输入提示“用户名”,textBox1用于接收用户输入的用户名信息。
2)如图1-23所示,用鼠标拖出一个包含label2和textBox1的矩形框,将这2个控件同时选中。如图1-24所示,在按住〈Ctrl〉键的同时(此时鼠标指针旁出现一个表示“复制”的“+”标记)拖动选中的2个控件到适当的位置放手(先松开鼠标后释放键盘),完成这2个控件的复制操作(分别用于提示和接收用户输入的密码信息)。
图1-22 添加控件
图1-23 选择多个控件
图1-24 拖动复制多个控件
可以看到,通过复制得到的标签上显示的默认文本与源控件相同,都是label2。选中复制得到的控件,在“属性”窗口中可以看到系统自动将其Name属性分别设置为label3和textBox2,是源控件Name属性的自动延续。
3)从工具箱中继续向窗体中添加2个按钮控件button1、button2,初步设计完成的程序界面如图1-25所示。
3.设置对象属性
各控件的初始属性设置如表1-2所示。设置完毕后的程序界面如图1-26所示(注意,此时的程序标题并没有相对窗体居中显示)。
图1-25 初步完成的界面设计
图1-26 完成控件的初始属性设置
表1-2 设置控件属性
4.编写程序代码
在窗体设计器中双击窗体,切换到代码编写窗口,按如下所示编写窗体装入时和“重置”按钮被单击时执行的事件处理程序代码。双击窗口,系统将自动创建窗体装入时的事件处理程序框架。同样,在窗体设计器中双击“重置”按钮,系统将自动创建该按钮的单击事件处理程序框架。
窗体装入时执行的事件处理程序代码如下。
“重置”按钮被单击时执行的事件处理程序代码如下。
5.运行和调试程序
按〈F5〉键运行程序,观察界面设计是否得当,测试“重置”按钮被单击时是否能实现预期的程序功能。反复多次测试运行,直至所有问题均被纠正。
6.保存或打开项目
(1)保存项目文件
保存项目文件通常可通过以下两种途径来实现。
1)在Visual Studio集成开发环境中若单击工具栏上的“运行”按钮 或按〈F5〉键运行程序,系统将自动保存所有项目文件到创建项目时指定的文件夹中。
2)在设计过程中用户也可单击工具栏中的“保存窗体文件”按钮 或“保存所有文件”按钮 ,随时保存项目文件。此外,用户在关闭Visual Studio窗口时系统也会判断用户是否在修改了文件内容后没有执行保存操作,若没有执行保存操作,则弹出对话框提示用户保存文件。
(2)打开项目
常规的方法是启动Visual Studio,选择“文件”→“打开解决方案”命令,在弹出的对话框中找到保存项目的文件夹,双击解决方案文件(*.sln)即可打开程序项目。
此外,启动Visual Studio时,若在“起始页”的“最近”选项组中包含有要打开的项目名称,则单击该名称也可打开对应的程序项目。