第三章编写第一个应用程序 介绍了C#语言的这么多优点,您可能已经有些不耐烦了。好,那就让我们开始C# 的开发之路吧。 本章介绍如何生成您的第一个C#程序。这是一个最基本的C#应用程序,程序中 的代码在全书中将经常出现。 我一直坚信,只有不断练习才是最好的学习方式。所以建议读者从本章开始,对 书中所提供的程序示例,亲自进行编辑、编译和运行,在这个过程中,您将获得开发 C#程序的有益经验 3.1 Welcome程序 可以这么说,与用户没有任何交互的应用程序根本没有任何用处(病毒和黑客当 然除外。然而即使是病毒程序的作者,也常常喜欢在自己得逞之后炫耀一番)。学习任 何一门语言,绝大多数情况下人们都是从输入输出开始的。 第一个程序总是非常简单的。我们让用户通过键盘输入自己的名字,然后程序在 屏幕上打印一条欢迎信息。程序的代码是这样的: 程序清单3-1 using System class Welcome static void Maino i Console. WriteLine("Please enter your name: " Console. ReadLineo Console. Writeline("Welcome to you! ") 您可以在任意一种编辑软件中完成上述代码的编写,然后把文件存盘,文件名叫 做 Welcome.cs典型的C#源文件通常都是以“cs”作为文件的扩展名。 32代码分析 首先要提出的是,C#语言是大小写敏感的。这一点对于C和C++程序员没什么问
第三章 编写第一个应用程序 介绍了 C#语言的这么多优点 您可能已经有些不耐烦了 好 那就让我们开始 C# 的开发之路吧 本章介绍如何生成您的第一个 C#程序 这是一个最基本的 C#应用程序 程序中 的代码在全书中将经常出现 我一直坚信 只有不断练习才是最好的学习方式 所以建议读者从本章开始 对 书中所提供的程序示例 亲自进行编辑 编译和运行 在这个过程中 您将获得开发 C#程序的有益经验 3.1 Welcome 程序 可以这么说 与用户没有任何交互的应用程序根本没有任何用处 病毒和黑客当 然除外 然而即使是病毒程序的作者 也常常喜欢在自己得逞之后炫耀一番 学习任 何一门语言 绝大多数情况下人们都是从输入输出开始的 第一个程序总是非常简单的 我们让用户通过键盘输入自己的名字 然后程序在 屏幕上打印一条欢迎信息 程序的代码是这样的 程序清单 3-1 using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); Console.ReadLine(); Console.WriteLine("Welcome to you!"); } } 您可以在任意一种编辑软件中完成上述代码的编写 然后把文件存盘 文件名叫 做 Welcome.cs 典型的 C#源文件通常都是以 .cs 作为文件的扩展名 3.2 代 码 分 析 首先要提出的是 C#语言是大小写敏感的 这一点对于 C 和 C++程序员没什么问
题,只是要提醒一下ⅤB和 Delphi的程序员 接下来让我为您逐条地分析上面的C#程序语句 32.1名字空间 sing System表示导入名字空间。高级语言总是依赖于许多系统预定义的元素。如果 您是C或C++的程序员,那么您一定对使用# include之类的语句来导入其它C或C++ 源文件再熟悉不过了。C#中的含义与此类似,用于导入预定义的元素,这样在自己的 程序中就可以自由地使用这些元素 如果没有导入名字空间的话,我们该怎么办呢,程序还能保持正确吗?答案是肯 定的。那样的话,我们就必须把代码改写成下面的样子: 程序清单3-2 class Welcome static void maino i System. Console. WriteLine("Please enter your name: ) System. Console. Writeline("Welcome to you! ") 也就是说,在每个 Console前加上一个前缀“ System”。这个小原点“”表示 Console 是作为 System的成员而存在的。C#中抛弃了C和C+中繁杂且极易出错的操作符像 和“->”等。C#中的复合名字一律通过“”来连接 System是Net平台框架提供的最基本的名字空间之一。有关名字空间的详细使用 方法我们将放在第十七章中详细介绍。在这里,只要我们学会怎样导入名字空间就足 够了 322类和类的方法 让我们从写第一个程序时就记住:每个东西都必须属于一个类。如果您是C或C++ 的程序员,请暂时忘掉那些全局变量 在程序的第二行, class Welcome声明了一个类,类的名字叫做 Welcome。这个程 序为我们所作的事情就是依靠它来完成的 和C、C++中一样,源代码块被包含在一对大括号“{”和“}”中。每一个右括号 }”总是和它前面离它最近的一个左括号“{”相配套。如果左括号“{”和右括号“}” 没有全部配套,那程序就是一个错误的程序 static void main(表示类 Welcome中的一个方法。方法总是为我们完成某件工作的。 注意:在C并程序中,程序的执行总是从Min()方法开始的。一个程序中不允许出
题 只是要提醒一下 VB 和 Delphi 的程序员 接下来让我为您逐条地分析上面的 C#程序语句 3.2.1 名字空间 using System 表示导入名字空间 高级语言总是依赖于许多系统预定义的元素 如果 您是 C 或 C++的程序员 那么您一定对使用#include 之类的语句来导入其它 C 或 C++ 源文件再熟悉不过了 C#中的含义与此类似 用于导入预定义的元素 这样在自己的 程序中就可以自由地使用这些元素 如果没有导入名字空间的话 我们该怎么办呢 程序还能保持正确吗 答案是肯 定的 那样的话 我们就必须把代码改写成下面的样子 程序清单 3-2 class Welcome { static void Main() { System.Console.WriteLine("Please enter your name:"); System.Console.ReadLine(); System.Console.WriteLine("Welcome to you!"); } } 也就是说 在每个 Console 前加上一个前缀 System. 这个小原点 . 表示 Console 是作为 System 的成员而存在的 C#中抛弃了 C 和 C++中繁杂且极易出错的操作符像 :: 和 -> 等 C#中的复合名字一律通过 . 来连接 System 是.Net 平台框架提供的最基本的名字空间之一 有关名字空间的详细使用 方法我们将放在第十七章中详细介绍 在这里 只要我们学会怎样导入名字空间就足 够了 3.2.2 类和类的方法 让我们从写第一个程序时就记住 每个东西都必须属于一个类 如果您是 C 或 C++ 的程序员 请暂时忘掉那些全局变量 在程序的第二行 class Welcome 声明了一个类 类的名字叫做 Welcome 这个程 序为我们所作的事情就是依靠它来完成的 和 C C++中一样 源代码块被包含在一对大括号 { 和 } 中 每一个右括号 } 总是和它前面离它最近的一个左括号 { 相配套 如果左括号 { 和右括号 } 没有全部配套 那程序就是一个错误的程序 static void Main()表示类 Welcome 中的一个方法 方法总是为我们完成某件工作的 注意 在 C#程序中 程序的执行总是从 Main()方法开始的 一个程序中不允许出
现两个或两个以上的Min()方法。对于习惯了写C控制台程序的读者,请牢记:#中 Min()方法必须被包含在一个类中。 323程序的输入和输出 程序所完成的输入输出功能都是通过 Console来完成的。 Console究竟是什么呢? 它是在名字空间中 System已经为我们定义好的一个类,这里我们不用管它是怎么完成 工作的,只要使用它就可以了。 上面的代码中,类 Console为我们展现了两个最基本的方法: WriteLine和 Readline Console readline表示接受输入设备输入, Console. WriteLine则用于在输出设备上输 我们再为读者介绍 Console中用于输入输出的另两个方法:Read和 Write d它们和 ReadLine与 Writeline的不同之处在于, ReadLine和 WriteLine执行时相当在显示时多 加了一个回车键,而使用Read和 Write时则光标不会自动转移到下一行 让我们再对例子程序进行扩展,使得用户的输入对输出产生作用。 程序清单3-3: tatic void Maino i Console. WriteLine("Please enter your name: ) string name=Console. Read Lineo; Console. Writeline( Welcome to you, 101!", name); 我们用到了 string name= Console. Read Line()这条语句。其中 string name表示声明 个字符串类型的变量name。系统定义的 Console类提供的方法 Readline)的返回值类型 为 string。所以,这句话表示从输入设备读取一个字符串,并把读取的值赋予变量name 再来看一下程序的最后一条输出语句 这条语句表示在屏幕上对输出的字符串进行格式化。其中表示用方法的第二个参 数来替代格式化后字符串相应的位置。对字符串进行格式化的参数可以是一个字符串, 也可以是一个字符,或者是一个整数,等等。采用这种方式最多可以格式化三个变量。 比如: string namel=Mike”;
现两个或两个以上的 Main()方法 对于习惯了写 C 控制台程序的读者 请牢记 C#中 Main()方法必须被包含在一个类中 3.2.3 程序的输入和输出 程序所完成的输入输出功能都是通过 Console 来完成的 Console 究竟是什么呢 它是在名字空间中 System 已经为我们定义好的一个类 这里我们不用管它是怎么完成 工作的 只要使用它就可以了 上面的代码中 类 Console 为我们展现了两个最基本的方法 WriteLine 和 ReadLine Console.ReadLine 表示接受输入设备输入 Console. WriteLine 则用于在输出设备上输 出 我们再为读者介绍 Console 中用于输入输出的另两个方法 Read 和 Write 它们和 ReadLine 与 WriteLine 的不同之处在于 ReadLine 和 WriteLine 执行时相当在显示时多 加了一个回车键 而使用 Read 和 Write 时则光标不会自动转移到下一行 让我们再对例子程序进行扩展 使得用户的输入对输出产生作用 程序清单 3-3 using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); string name = Console.ReadLine(); Console.WriteLine("Welcome to you,{0}!",name); } } 我们用到了 string name = Console.ReadLine()这条语句 其中 string name 表示声明一 个字符串类型的变量 name 系统定义的 Console 类提供的方法 ReadLine()的返回值类型 为 string 所以 这句话表示从输入设备读取一个字符串 并把读取的值赋予变量 name 再来看一下程序的最后一条输出语句 Console.WriteLine("Welcome to you,{0}!",name); 这条语句表示在屏幕上对输出的字符串进行格式化 其中表示用方法的第二个参 数来替代格式化后字符串相应的位置 对字符串进行格式化的参数可以是一个字符串 也可以是一个字符 或者是一个整数 等等 采用这种方式最多可以格式化三个变量 比如 int x = 3; string name1 = “Mike”;
string name2=“John” t0) times, 1) and (2)!" x, namel, name 2) 和绝大多数编程语言一样,C#提供了字符串类型 string,它与C中的MFC为我们 提供的类十分类似。C#中的 string类型是一个引用类型(引用类型在第四章中我们有 详细说明),为标准字符集。利用 string可以方便地对字符串进行连接、截断等操作。 比如 string s=ˇGood"+ Morning” 例子演示了字符串s由两个字符串“Good”和“ morning”相加得到。字符串还可 以通过下标进行索引,得到一个字符。上面的例子中字符x的值为“o”。 所以,源程序34和源程序3-3的作用没什么区别 程序清单3-4 using System; class Welcome tatic void maino i Console. Writeline("Please enter your name string message="Welcome to you"+ Console. Readline(; Console. WriteLine( message) 33运行程序 理解了源程序中每条代码的具体含义之后,下一步要做的就是让这个程序真正能 够运行。不过对源代码即使还有不明白的地方也没有关系,在后续章节的学习中,您 最终会熟练掌握这些概念的 如果您的电脑上安装了Ⅴ isual Studio Net,则可以在集成开发环境( Integrated Developer Environment,IDE)中直接选择快捷键或菜单命令,编译并执行源文件。 如果您不具备这个条件,那么您至少需要安装 Microsoft Net framework SDK,这 样才能够不妨碍您在本书中继续学习C#语言。实际上,Net平台内置了C#的编译器。 下面让我们使用这个微软提供的命令行编译器对我们的程序进行编译 启动一个命令行提示符,在屏幕上输入一行命令 csc welcome. cs
string name2 = “John”; Console.WriteLine("Welcome to you {0} times,{1} and {2}!",x,name1,name2); 和绝大多数编程语言一样 C#提供了字符串类型 string 它与 C 中的 MFC 为我们 提供的类十分类似 C#中的 string 类型是一个引用类型 引用类型在第四章中我们有 详细说明 为标准字符集 利用 string 可以方便地对字符串进行连接 截断等操作 比如 string s = “Good” + “Morning”; char x = s[3]; 例子演示了字符串 s 由两个字符串 Good 和 Morning 相加得到 字符串还可 以通过下标进行索引 得到一个字符 上面的例子中字符 x 的值为 o 所以 源程序 3-4 和源程序 3-3 的作用没什么区别 程序清单 3-4 using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); string message = “Welcome to you “ + Console.ReadLine(); Console.WriteLine(message); } } 3.3 运 行 程 序 理解了源程序中每条代码的具体含义之后 下一步要做的就是让这个程序真正能 够运行 不过对源代码即使还有不明白的地方也没有关系 在后续章节的学习中 您 最终会熟练掌握这些概念的 如果您的电脑上安装了 Visual Studio .Net 则可以在集成开发环境 Integrated Developer Environment IDE 中直接选择快捷键或菜单命令 编译并执行源文件 如果您不具备这个条件 那么您至少需要安装 Microsoft .Net Framework SDK 这 样才能够不妨碍您在本书中继续学习 C#语言 实际上 .Net 平台内置了 C#的编译器 下面让我们使用这个微软提供的命令行编译器对我们的程序进行编译 启动一个命令行提示符 在屏幕上输入一行命令 csc welcome.cs
我们假设您已经将 welcome.cs文件保存在当前目录下。如果一切正常, welcome 文件将被编译、运行,屏幕上出现一行字符,提示您输入姓名: Please enter your name 输入任意个字符并按下回车键,屏幕将打印出欢迎信息 Welcome to you! 注意:和到目前为止我们使用过的绝大多数编译器不同,在O中,编译器只执行 编译这个过程,而在C和C艹中要经过编译和链接两个阶段。换而言之,(#源文件并不 被编译为目标文件(.ob),而是直接生成可执行文件(.exe)或动态链接库(.dl1)。 #编译器中不需要包含链接器 编译选项 我们可以灵活地使用Net平台提供的命令行编译器的不同选项,选择不同的编译 方式,从而灵活地对编译进行控制 例如,如果我们希望对源文件 Welcome.cs进行编译,生成名为 My Welcome.exe的 可执行文件,我们可以采用这样的命令 sc/out: My Welcome. exe Welcome.cs 如果我们并不需要一个可执行文件,而仅仅是希望简单地检查源文件中是否存在 语法错误,则命令可以写成: csc/nooutput: Welcome.cs 如果不知道各个选项的具体含义,可以通过求助来获得: 为方便读者,我们在表3-1中按字母排序的顺序列出了命令行编译器cSc常用的参 数及其用途。更详细的信息请参阅C#联机帮助文档。 表3-1命令行编译器选项 选项 作用 指定响应文件 列出编译命令选项 /addmodule 指定一个或多个模块作为装配的一部分 /baseaddress 指定载入动态链接库的首选地址 /bugreport 生成一个报告文件,其中包含程序Bug的详细信息 /checked 指定算术运算的溢出是否会导致程序在运行时抛出一个异常 指定编译的所有源文件所使用的代码页 给出调试信息 定义预处理程序的符号 /doc 扫文件注释生成XML文件 指定输出的绝对路径 列出编译命令选项 允许对源文件进行递增式编译 Alinkresource 在装配时链接指定的NET资源
我们假设您已经将 welcome.cs 文件保存在当前目录下 如果一切正常 welcome.cs 文件将被编译 运行 屏幕上出现一行字符 提示您输入姓名 Please enter your name: 输入任意个字符并按下回车键 屏幕将打印出欢迎信息 Welcome to you! 注意 和到目前为止我们使用过的绝大多数编译器不同 在 C#中 编译器只执行 编译这个过程 而在 C 和 C++中要经过编译和链接两个阶段 换而言之 C#源文件并不 被编译为目标文件 .obj 而是直接生成可执行文件 .exe 或动态链接库 .dll C#编译器中不需要包含链接器 编译选项 我们可以灵活地使用 .Net 平台提供的命令行编译器的不同选项 选择不同的编译 方式 从而灵活地对编译进行控制 例如 如果我们希望对源文件 Welcome.cs 进行编译 生成名为 MyWelcome.exe 的 可执行文件 我们可以采用这样的命令 csc/out: MyWelcome.exe Welcome.cs 如果我们并不需要一个可执行文件 而仅仅是希望简单地检查源文件中是否存在 语法错误 则命令可以写成 csc/nooutput: Welcome.cs 如果不知道各个选项的具体含义 可以通过求助来获得 csc/? 为方便读者 我们在表 3-1 中按字母排序的顺序列出了命令行编译器 csc 常用的参 数及其用途 更详细的信息请参阅 C#联机帮助文档 表 3-1 命令行编译器选项 选项 作用 @ 指定响应文件 /? 列出编译命令选项 /addmodule 指定一个或多个模块作为装配的一部分 /baseaddress 指定载入动态链接库的首选地址 /bugreport 生成一个报告文件 其中包含程序 Bug 的详细信息 /checked 指定算术运算的溢出是否会导致程序在运行时抛出一个异常 /codepage 指定编译的所有源文件所使用的代码页 /debug 给出调试信息 /define 定义预处理程序的符号 /doc 由文件注释生成 XML 文件 /fullpaths 指定输出的绝对路径 /help 列出编译命令选项 /incremental 允许对源文件进行递增式编译 /linkresource 在装配时链接指定的 NET 资源