1.2 程序设计的一般步骤
在Visual Studio集成开发环境中,可以创建C#、VB、C++等多种不同语言的程序。创建C#应用程序时,也可以在几种不同类型的“项目”中作出选择,如下所述。
• 控制台应用程序:不涉及Windows系统的组成元素,因而结构较为简单。在初学C#程序设计时使用这种类型的程序可以简化问题的讨论。
• Windows窗体应用程序:通过窗体上的各种GUI元素(窗体、文本框、按钮等)形成与用户交流的界面。
• WPF(Windows Presentation Foundation,Windows呈现基础)应用程序:基于WPF(微软推出的一种新的图形化界面编程的库)的窗体程序。
• 类库:编译后生成.dll(动态链接库)文件,此后便可在程序中引用了。
• Windows窗体控件库:用于创建用户的控件。
注意
一个.NET环境中的C#程序称为一个“项目”。一个项目中包含应用程序的所有原始资料:源代码文件、资源文件(如图标、对程序依赖的外部文件的引用)以及配置数据(如编译器设置)。生成项目时,Visual C#调用C#编译器和其他内部工具,以使用项目中的文件创建可执行程序集。
本书只使用前两种项目。
1.2.1 Visual C#开发环境
Visual C#(以下简称VC#)是基于Windows平台的集成开发环境,广泛应用于各种应用程序设计,从底层软件直到上层直接面向用户的软件,适用于各种特殊的、复杂的和综合性的软件项目的开发。实际上,Visual C#与Visual Basic、Visual C++等共同使用同一个称为Microsoft Visual Studio的集成开发环境(IDE),能够进行工具共享,甚至轻松地创建混合语言解决方案。
VC#为用户提供了可视化的集成开发环境,其中包括所有设计、调试、配置应用程序所用到的工具。通过这些工具,可以很容易地创建程序中的代码和可视化部分,及时地观察界面设计过程中的任何变化,并利用调试功能来查错和纠错,从而快速地设计出符合要求和使用户满意的应用程序。
VC#的用户界面如图1-5所示。这是创建了一个C#的“Windows窗体应用程序”之后显示出来的VC# 2013窗口。可以看到,该窗口由标题栏(顶部)、菜单栏(标题栏下面)、工具栏(菜单栏下面)、窗体设计窗口(名为Form1.cs[设计])、代码编辑窗口(名为Form1.cs,未显示出来,可单击页标签切换)、输出窗口(左下部)、解决方案资源管理器窗口以及其他多个窗口,如类视图窗口、属性窗口等。
图1-5 VC#窗口
1. 标题栏
标题栏上显示了当前正在编辑的项目名和正在打开的文件名。当VC#处于不同状态时,标题栏上会显示不同的信息。在标题栏右侧有最小化、最大化和关闭3个按钮。需要注意的是,这里的关闭按钮用于控制整个Visual C#环境的关闭。
2. 菜单栏
菜单栏由“文件”“编辑”“视图”“项目”“生成”“调试”等多个菜单组成,每个菜单又由多个菜单项组成。这些菜单项可按其使用方式分为4类:普通命令、带有快捷键的命令、可弹出对话框的命令和带有级联菜单的命令。
(1)普通命令:使用这些命令时,直接单击菜单项,或在按住Alt键的同时,敲一下菜单项上以下划线标出的字母(称为热键)即可。例如,使用“关闭”命令的方法是:单击“文件”菜单名,打开“文件”菜单,然后单击“关闭”项。或按热键Alt+F,打开“文件”菜单,然后按热键Alt+C,执行“关闭”命令。
(2)带有快捷键的命令:有些菜单项设置了相应的快捷键,直接按快捷键即可执行相应的命令。例如,“编辑”菜单中的“复制”项的快捷键是Ctrl+C,直接按这个快捷键(按住Ctrl不放,再敲一下字母键C)就可以执行“复制”命令。又如,如果一个应用程序已经编译通过,则可按快捷键Ctrl+F5运行这个程序。
(3)可弹出对话框的命令:这类命令都带有3个小圆点的省略号,单击即可弹出相应的对话框。例如,选择“工具”菜单的“选项”命令,会弹出名为“选项”对话框,可在其中对集成开发环境的外观、性能等进行设置。
(4)带有级联菜单的命令:这些命令项带有一个向右的小三角,选择一个命令就会打开一个级联菜单,其中包括相关的一些命令。例如,选择“文件”菜单的“新建”命令,在打开的级联菜单中包括了“项目”“网站”和“文件”等几条命令。选择其中的“项目”命令(可弹出对话框),就会弹出一个名为“新建项目”的对话框,可在其中设置“项目类型”“名称”与“保存位置”等。
有些菜单项的名称还会根据集成开发环境的状态而改变,例如,“生成”菜单中的“生成”命令项中包含了应用程序的名称,这个名称就是根据当前正在编辑的应用程序而变化的。
3. 工具栏
工具栏位于菜单栏下方,由一些常用菜单命令的加速按钮组成。将鼠标箭头移到某个按钮上,就会弹出一条提示信息(一般为按钮的名称)。
工具栏分为许多种,如“标准”工具栏、“生成”工具栏以及“类设计器”工具栏等。可以选择“视图”菜单的“工具栏”命令,显示或隐藏某个工具栏。也可以选择“工具”菜单的“自定义”命令,弹出“自定义”对话框,给某个工具栏上添加自己需要的工具按钮,或者删除某个按钮。
4. 窗体设计器、工具箱及属性窗口
窗体设计器默认情况下位于中上部,往往是窗口上面积最大的一块,初始状态时,包含一个空窗体。工具箱在左侧,默认状态下只在左侧显示一个标题栏,可右键单击并选择“停靠”菜单项,使其成为图中的样式。属性窗口默认状态下位于右下部。
用户可依据程序的需求,按照以下方式设计窗体。
• 将左侧工具箱中的控件,如按钮(Button)、文本框(TextBox)、列表框(ListBox)等拖放到窗体上。
• 通过属性窗口来改变窗体或控件的某些属性(如将按钮上的文字改为“求y值”)。
• 通过属性窗口的事件页来创建事件(如按钮单击事件)处理方法。这时,代码编辑器中会自动产生相应的事件处理方法的框架(头语句及一对花括号),框架中填写的程序源代码就与相应事件关联起来了。
程序运行后,这个窗体就成为程序与用户交互操作的“窗口”,也就是该程序的图形用户界面。例如,用户可在文本框输入数据,程序可在列表框中输出计算结果。
5. 代码编辑器
代码编辑器实际上是一个文本编辑器,默认情况下位于中上部(可单击页标签,从窗口设计器切换过来),如图1-6所示。大多数情况下,这个窗口用于输入、显示和编辑与某种语言相关联的源代码(如C#代码),故称为代码编辑器。但有时也可能编辑不关联语言的其他文本。
图1-6 打开了代码编辑器的VC#窗口
可以打开多个代码编辑器(相当于同时打开了多个文件),在不同的窗体或模块中查看代码,或在它们之间复制和粘贴代码。默认情况下,打开了的所有代码编辑器占据同样的位置,单击某个页标签(显示相应文件名)或者选择右侧“解决方案资源管理器”中的相应项,即可切换到相应的代码编辑器。
6. 解决方案资源管理器
为了高效地管理在创建应用程序时所需的各种事项,如引用、数据连接、文件夹和文件等,VC#提供了两种容器:解决方案和项目。可以使用解决方案资源管理器来查看和管理这些容器及其关联事项。
通过“视图”菜单的“解决方案资源管理器”命令,可以打开或者关闭解决方案资源管理器。它提供项目及其文件的有组织的视图,并且提供对项目和文件相关命令的便捷访问,可用于在解决方案或项目中查看必要的事项并执行管理任务。
单个解决方案及其项目以分层显示的方式出现,这种显示方式提供关于解决方案、项目和项的状态的更新信息,可用于同时处理几个项目。解决方案容器还可以包含多个项目,而项目容器通常包含多个相关的事项。利用这些容器可以进行以下工作。
• 作为一个整体,管理解决方案的设置,或管理单个项目的设置。
• 使用解决方案资源管理器处理文件管理的细节,以便将精力集中于那些组成开发工作的事项上。
• 添加对解决方案中多个项目有用或对该解决方案有用的事项,而不必在每个项目中引用这个事项。
• 处理与解决方案或项目无关的杂项文件。
1.2.2 创建控制台应用程序
应用程序可按其与用户的交互方式分为两种:字符方式的应用程序和图形用户界面的应用程序。在VC#开发环境中,“控制台应用程序”就是字符方式的程序,这种程序在控制台窗口上以命令行方式输出和读取信息,并与用户进行交互式操作。控制台应用程序被编译成可执行(扩展名为.exe)文件,可以作为独立的应用程序以命令行方式运行。而“Windows窗体应用程序”是一种图形用户界面的程序,这种程序通过用户自定义的窗口以及窗口上摆放的各种控件(按钮、文本框、列表框以及菜单、工具栏、对话框等)来输出和读取信息,并与用户进行交互式操作。
例1-2 输入圆的半径,求解并输出圆的周长和面积。
本例中,将首先在VC#环境中生成一个“控制台应用程序”,然后输入C#程序的内容,再编译并运行该程序。
注意
控制台应用程序在运行时不需要图形用户界面。控制台应用程序不能由集成开发环境自动产生,用户必须自己输入程序的内容。
1. 启动VC#环境
选择菜单项:“开始”→“所有程序”→“Visual Studio 2013”→“Visual Studio 2013”,打开Microsoft Visual Studio窗口。
2. 创建VC#控制台项目
选择菜单选项:“文件”→“新建”→“项目”,或单击窗口上的“新建项目”按钮,弹出图1-7所示的“新建项目”对话框,然后在该对话框中进行以下设置。
• 选择该对话框左栏的“模板”项中的“Visual C#”项。
• 选择中间栏中的“控制台应用程序”。
• 在“位置”下拉列表框中输入或选择(单击“浏览”按钮,并在打开的对话框中查找)一个文件夹,作为保存应用程序的位置。
• 在“名称”文本框中键入“求圆的周长和面积”作为应用程序的名称。
• 必要时,在“解决方案”下拉列表框的“创建解决方案”、“添加到解决方案”或者“在新实例中创建”中作出选择(前者为默认值)。
• 必要时,在“解决方案名称”文本框中输入一个字符串作为解决方案的名称。
注意
VC#提供了各种应用程序(控制台应用程序、Windows窗体应用程序、类库等)模板。通过使用这些模板来创建应用程序,将会大大简化设计用户界面的工作。
图1-7 新建项目对话框
单击“确定”按钮后,VC#自动创建名为“求圆的周长和面积”的控制台应用程序,并立即在代码编辑器窗口中添加“求圆的周长和面积.Program”页,如图1-8所示。
图1-8 创建了控制台应用程序后的VC#窗口
这个代码编辑器中已经自动产生了一些代码,包括以下几部分。
• 命名空间的引用:使用using关键字指定所引用的命名空间。本例中引用了System命名空间及其下属的几个子命名空间。
• 命名空间的定义:使用namespace关键字定义命名空间,本例中定义了名为“求圆的周长和面积”的命名空间。
• 某个命名空间中的类的定义:使用class关键字定义类,本例在“求圆的周长和面积”命名空间中定义了名为“Program”的类。
• 某个类中的方法的定义:本例在Program类中定义了名为Main的方法。这个Main方法是执行C#程序时的起点。
3. 键入和编辑C#源程序
本例所编写的程序比较简单,所有执行具体操作的C#源代码都将要添加到这个Main方法中。键入和编辑完成后Main方法的内容如下。
static void Main(string[] args) { //计算圆的周长和面积 const double PI = 3.14159265; Console.Write("半径=? "); double r=double.Parse(Console.ReadLine()); //输入半径 if(r>=0) // 当半径不为负数时计算周长和面积 { double length = 2 * PI * r; double area = PI * r * r; Console.WriteLine("半径为{0} 的圆的周长={1}", r, length); Console.WriteLine("半径为{0} 的圆的面积={1}", r, area); }else Console.WriteLine("圆的半径不能为负数!"); }
其中C#代码由以下几部分组成。
(1)注释:一行中由双斜杠“//”引出的内容是为了方便阅读程序而加上去的,不影响程序的执行,可以去掉。
(2)常量PI的定义:const、double和3.14分别表示PI是常量,属于双精度型数据类型,其值为3.14159265。
(3)输出一个字符串“半径=?”:程序运行后,这个字符串将会显示出来且后面跟一个闪烁的光标,提示用户在此输入圆的半径。这里的Console是System命名空间中预先定义的一个类,Write是这个类中的一个方法,Console.Write()调用这个方法。
(4)定义变量r,并从键盘上输入r值。
• double表示r是一个双精度型变量。
• ReadLine是这个类中的一个方法,Console.ReadLine()调用这个方法来接收用户键入的一个字符串,double.Parse调用double类的Parse方法来将用户键入的数字型字符串转换成双精度数。
• 符号“=”称为赋值号,用于将右边表达式求值的结果赋给左边的变量。
(5)计算圆的周长和面积。条件语句
if(r>=0) … else …
的功能为:当括号中的条件r>=0成立时,执行if块(if之后,else之前)中的语句,计算并输出圆的周长和面积;否则执行else块(else之后)中的语句,输出出错后的提示信息。这里Console.WriteLine调用Console的WriteLine方法,输出由括号中第一个参数
"半径为{0}的圆的周长={1}"
所定义的字符串,该字符串中{0}处输出变量r的值,{1}处输出变量length的值。
4. 编译和运行C#程序
在输入和编辑完成之后,可以编译并运行程序。本例中的操作步骤如下。
(1)选择“生成”菜单的“生成 求圆的周长和面积”命令,则当程序没有错误时,就会编译通过,并在输出窗口中显示“半径=?”,输入一个数字作为半径的值并按回车键,就会显示计算得到的周长和面积的值,如图1-9(a)所示。
(2)选择“调试”菜单的“开始执行(不调试)”命令,或按组合键Ctrl+F5,也会弹出运行程序的窗口,假定输入-1作为半径的值,则会显示图1-9(b)所示的内容。
图1-9 控制台应用程序的运行窗口
关闭了该窗口之后,程序的运行就结束了。
在输入、编辑和调试程序的过程中,应注意保存程序。选择“文件”菜单的“全部保存”命令,或单击工具栏上的“全部保存”按钮,即可保存正在编辑的项目的全部内容。
1.2.3 创建Windows窗体应用程序
C#既是面向对象的,又提供了用于图形用户界面设计的预建组件类库。VC#还是一种事件驱动的可视化编程语言。它通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能完善且易于使用的调试器以及其他工具,实现了C#应用程序的快速开发。同时,应用程序还可以通过.NET框架的类库来访问多种操作系统服务以及很多精心设计的类,从而加快软件开发的周期。
例1-3 计算应付货款:输入单价和数量(件数),按10件以下原价、10件以上九折计算应付货款金额。
本例中,将首先在VC#环境中生成一个“Windows窗体应用程序”,然后在窗体上摆放用于输入/输出和发出计算命令的控件并编写计算货款的C#代码作为某个事件处理方法的内容,最后运行程序。
1. 启动VC#环境
选择菜单项:“开始”→“所有程序”→“Visual Studio 2013”→“Visual Studio 2013”,打开Microsoft Visual Studio窗口。
2. 创建VC#控制台项目
选择菜单选项:“文件”→“新建”→“项目”,或单击窗口上的“新建项目”按钮,弹出图1-10所示的“新建项目”对话框。然后在该对话框中进行以下设置。
图1-10 新建项目对话框
• 选择该对话框左栏的“模板”项中的“Visual C#”项。
• 选择中间栏中的“Windows窗体应用程序”。
• 在“位置”下拉列表框中输入或选择(单击“浏览”按钮,并在打开的对话框中查找)一个文件夹,作为保存应用程序的位置。
• 在“名称”文本框中键入“求应付货款”作为应用程序的名称。
• 必要时,在“解决方案名称”文本框中输入一个字符串作为解决方案的名称。
单击“确定”按钮后,VC#自动创建名为“求应付货款”的控制台应用程序,并立即在窗体设计器区域添加一个“Form1.cs[设计]”页,如图1-11所示。
图1-11 创建了Windows窗体应用程序后的VC#窗口
这个窗体设计器中有一个空的窗体,可以在图1-12所示的属性窗口中查看或者修改它的属性(相应单元格中输入或选择)。例如,可以看到,VC#为该窗体自动命名的Name属性(窗体的名称)的值为Form1。AutoSize属性(窗体是否自动调整大小)的值为False。如果使用右侧的滚动条,还可以看到Text属性(标题栏上显示的内容)的值也是Form1。
图1-12 属性窗口
3. 设计窗体
本例中,窗体上摆放以下控件并修改控件的某些属性。
(1)将Form1窗体的Text属性改为“按输入的单价和数量计算货款”。
(2)两个标签(Label),其Text属性分别修改为“单价”和“数量”。
(3)两个文本框(TextBox),其Name属性分别修改为Price和Number。
(4)一个列表框(ListBox),其Name属性修改为Money,Items属性(多行文本)中添加一个字符串“应付货款金额:”。方法是:单击相应格中的符号,打开图1-13所示的“字符串集合编辑器”对话框,然后输入指定内容。
图1-13 字符串集合编辑器的对话框
(5)一个按钮(Button),其Text属性修改为“计算应付款”。
设计好的窗体如图1-14所示。
图1-14 设计好的窗体
4. 编写事件处理代码
本例中,按以下步骤编写按钮Button1的单击方法。
(1)在属性窗口中,单击工具栏上的“事件”按钮切换到事件页,然后在Click项右边的单元格中选择性输入“button1_Click”字符串,C#就会自动在代码编辑器中添加名为button1_Click的事件处理方法的框架(头语句及一对花括号),如图1-15所示。
图1-15 添加了按钮单击事件方法框架的代码编辑器
(2)在button1_Click事件处理方法中添加代码。本例中,添加代码之后的事件处理方法如下。
private void button1_Click(object sender, EventArgs e) { decimal p = Convert.ToDecimal(Price.Text); int n = Convert.ToInt16(Number.Text); decimal m = n * p; if (n >= 10) m *= 0.9m; Money.Items.Add("人民币"+decimal.Round(m,2).ToString()+" 元!"); }
这些代码分别执行以下操作。
• 将用户在Price文本框中输入的数字型字符串转换为decimal(小数)型数并赋值给decimal型变量p。
• 整型变量n和decimal型变量p相乘并赋值给decimal型变量m。
• 当整型变量n的值大于等于10时,decimal型变量m的值乘以0.9。其中if语句中的内嵌语句“m *= 0.9m;”也可以写成“m = m * 0.9m;”。因为m变量属于比double型范围小但精度高的decimal型,故当计算 m * 0.9时,要在0.9之后用m标记它,显式地将双精度型转换成小数型。
• 在Money列表框中输出计算得到的货款。语句中的Money.Items.Add()意为:调用Money列表框的Items属性的Add方法,在多行文本中追加一行。括号中使用运算符“+”将3个字符串连接在一起。在decimal.Round(m,2).ToString()中,先使用decimal.Round(m,2)方法将m变量转换为含两位小数的小数型变量,再使用ToString()方法将小数型变量转换成字符串。
5. 运行程序
设计好窗体并编写了相应的事件处理代码之后,就可以单击工具栏上的“启动”按钮或者选择“调试”菜单的“启动调试”命令来运行程序了。
本例中程序运行后,显示图1-16所示的窗口。分别在两个文本框中输入单价和数量,然后单击“计算应付款”按钮,便会在右侧的列表框中添加一行,显示计算结果。
图1-16 控制台应用程序的运行窗口
关闭了该窗口之后,程序的运行就结束了。
在输入、编辑和调试程序的过程中,应注意保存程序。选择“文件”菜单的“全部保存”命令,或单击工具栏上的“全部保存”按钮,即可保存正在编辑的项目的全部内容。