本文由中国C#技术学习中心整理 如果你对本文有不明之处请到技术论坛讨论!
第三章 第一个C#应用程序
3.0 选择一个编辑器
尽管我是一个顽固的Notepad狂,但这次我不建议用它编辑源码.原因是你正在与真正的编程语言打交道,使用Notepad编辑源码编译时可能产生大量的错误信息行( C++程序员知道我在说什么. )
你有几种选择.可以重新配置你信任的老式Visual C++ 6.0,使它能够和C#源文件一起工作.第二种选择是使用新的Visual Studio 7.第三,你可以用任何第三方程序编辑器,最好要支持行数、色彩编码、工具集成和良好的搜索功能.CodeWright就是其中一个例子,CodeWright 是你可以用于创建C#代码文件众多可能编辑器中的一个.
当然,在所提到的编辑器中,没有一个对创建C#程序来说是必要的.用Notepad肯定可以编辑.但是,如果你考虑到要编写更大的项目,最好还是忍痛割爱吧.(cnbruce建议采用Visual Studio .Net)
3.1 "Hello World" 代码
讨论编辑器有点离题 ,让我们把话题转回到一个非常出名的小应用程序.这个最短的C#版本应用程序见清单3.1.把它存起来,文件名为 helloworld.cs,以便使你能按照说明,完成诸如编译应用程序等其它余下来的步骤.
清单 3.1 最简单的 "Hello World "程序 (1,2,3,……7为行号,非程序:)
1: class HelloWorld 2: { 3: public static void Main( ) 4: { 5: System.Console.WriteLine( "Hello World" ); 6: } 7: } 在C#中,代码块( 语句组 )由大括弧( {和} )所括? K?甚至你以前没有C++的经验,你也可以说出Main( )方法就是HelloWorld 类语句的一部分,因为类被括在所定义的大括弧中.
C#应用程序( 可执行 )的入口点就是 static Main 方法,它必须包含在一个类中.仅有一个类能使用该标志定义,除非你告诉编译器它应使用哪一个 Main 方法( 否侧,会产生一个编译错误 ).
和C++相比,Main的第一个字母是大写的M,而不是你曾经使用过的小写字母.在这个方法中,你的程序开始并结束.方法中可以调用其它方法——如这个例子中,用于输出文本——或者创建对象并激活该方法.
正如你所看到的,Main方法返回一个void类型. public static void Main( )
尽管看到这些语句时,C++程序员肯定会觉得似曾相识,但是其他程序员并不如此.首先,public 的访问标志告诉我们这个方法可以被任何程序访问,这是它被调用的必要条件.其次,static 意味着没有先创建类的实例也可以调用方法——你所要做的就是用类名调用方法. HelloWorld.Main( );
但是,我不赞成在Main方法中执行这行代码,递归会导致堆栈溢出.
另一重要的方面是返回类型.对于方法Main,可选择void ( 意味着根本就没有返回值 ),或用int 为整型结果( 应用程序返回的错误级别 ).因此,两种可能的Main方法为: public static void Main( ) public static int Main( )
C++程序员会同样知道后面我要提到的——可以传给应用程序的命令行参数数组.如: public static void Main( string[] args )
我现在并不想详细地说明如何访问参数,但我想事先给C++程序员一个警告:和C++相比,应用程序路径不是这个数组的一部分.仅仅那些参数包含在这个数组中.
在对Main方法并不简短的介绍之后,让我们把注意力集中到唯一真正的代码行——这行代码在屏幕上显示"Hello Wold". System.Console.WriteLine( "Hello World" );
假如不是由于有了System,大家会马上猜到WriteLine是Console 对象的一个静态方法.那么System代表什么呢? 它是包含Console对象的名字空间( 范围 ),实际上并不是每次都在Console对象前加上名字空间的前缀,你可以象清单3.2所示范的那样,在应用程序中引入名字空间.
清单3.2 在应用程序中引入名字空间
1: using System; 2: 3: class HelloWorld 4: { 5: public static void Main( ) 6: { 7: Console.WriteLine( "Hello World" ); 8: } 9: } 所有你要做的就是给System名字空间加一个using指令.在这之后,不再需要规定名字空间,就可以使用它们的方法和属性了.NGWS 框架体系中有很多的名字空间,我只对巨大的名字空间池中的少数几个对象进行探讨.但在第八章 "用C#写组件"将介绍为你的对象创建自己的名字空间.
3.2 编译应用程序
由于NGWS Runtime支持所有的编译器( VB、C++和C# ),你不必买一个单独的开发工具用来把应用程序编译成IL( 中间语言 ).但是,如果你从没有用过命令行编译器编译过应用程序( 仅懂得编译名,而没有熟记 ), 它还是你的首要选择. 打开命令提示符并切换到存 helloworld.cs 的目录.敲入以下命令:
csc helloworld.cs helloworld.cs 被编译并链接成hellworld.exe.因为源码没有错误( 那当然! ),C#编译器没有出错提示,在整个编译过程没有丝毫停顿.
现在你已经准备好运行第一个真正用C#编写的应用程序.简单地在命令行上敲入helloworld,输出结果为 "Hello World".
在继续往下介绍之前, 我想稍为想象一下第一个应用程序和一个编译器开关的使用: csc /out:hello.exe helloworld.cs
这个开关告诉编译器输出文件命名为hello.exe.虽然这不是什么绝招,但它是这本书中用到的未来编译器的基本功.
3.3 输入和输出
到目前为止,我仅仅演示了把简单的常量字符串输出到屏幕.尽管这本书只介绍了C#编程的概念而不介绍用户接口编程,但我需要让你迅速学会简单的屏幕输入和输出方法——相应于C的scanf 和 printf,或者C++的cin 和cout.我不能提供VB相应的函数,因为屏幕访问不是该核心语言的一部分. 你只需要能够读用户的输入并提示一些信息给用户.清单3.3 说明如何读一个用户请求的名字输入,并显示一条已定制好的"Hello" 信息.
Listing 3.3 从控制台读输入信息
1: using System; 2: 3: class InputOutput 4: { 5: public static void Main( ) 6: { 7: Console.Write( "Please enter your name: " ); 8: string strName = Console.ReadLine( ); 9: Console.WriteLine( "Hello " + strName ); 10: } 11: } 第7行使用Console对象的一个新方法用于提示文本信息给用户,它就是Write方法.它与WriteLine不同的地方在于它输出时不换行.我使用这种方法以便用户可以在信息提示的同一行输入名字. 在用户输入他的名字后( 并按回车键 ),ReadLine 方法读入了一个字符串变量.名字字符串连接到常量字符串"Hello",并用我们早已熟悉的WriteLine方法显示出来
你几乎已学完了NGWS框架必要的输入和输出功能.但是,你还需要为用户显示多个值.为用户写一个格式串.清单3.4展示一个例子.
清单 3.4 使用不同的输出方法
1: using System; 2: 3: class InputOutput 4: { 5: public static void Main( ) 6: { 7: Console.Write( "Please enter your name: " ); 8: string strName = Console.ReadLine( ); 9: Console.WriteLine( "Hello {0}",strName ); 10: } 11: } 第9行包含了使用格式串的Console.WriteLine语句.格式串例子如下: "Hello {0}" {0}代替WriteLine方法的参数表中紧随格式串后的第一个变量.你可以用该技术格式化超过三个变量. Console.WriteLine( "Hello {0} {1}, from {2}", strFirstname, strLastname, strCity );
当然,并不仅限于只使用字符串变量.你可以使用任何类型,这些类型在后面的第四章 "C#类型"中有讨论.
3.4 添加注释
当写代码时,你应为代码写注释条文,解释实现的内容、变更史等.尽管你注释中提供的信息( 如果有的话 )是给你写的,但是你还是必须遵守写C#注释的方法.清单3.5 显示采用的两种不同的方式.
清单3.5 给你的代码添加注释
1: using System; 2: 3: class HelloWorld 4: { 5: public static void Main( ) 6: { 7: 8: /* 这种注释 9: 跨越多行 */ 10: Console.WriteLine( /*"Hello World"*/ ); 11: } 12: } " 符号用于单行注释.你可以用"//"注释当前所在行,或是跟在一个代码语句的后面: int nMyVar = 10; 所有在"后面的被认为是一条注释;所以,你可以同样用它们来注释一整行或一行源代码的部分.这种注释方式同C++中介绍的相似.
如果你的注释跨越多行,必须使用"/* */"的字符组合.这种方式在C中有效.除了单行注释外,这种方式在C++和C#中还同样有效.因C/C++和C#都使用这种多行注释方式,所以它们也使用相同的终结符.请看下列代码行: /* Console.WriteLine( "Hello World" ); */
我使用"/* */"简单地注释一整行.现在我假定这一行是很长代码的一部分,而且我决定要暂时禁用一个程序块: /* ... /* Console.WriteLine( "Hello World" ); */ ... */
这个结构所存在的问题为: "Hello World"那一行后面的"*/"终止了始于第一行的"/*"的注释,余下的代码对编译器有效,你将看到一些有趣的出错信息.至少 最后的"*/"被标志为归属错误.我只不过想提醒一下,让你了解这种错误.
3.5小结
在这一章中,你创建、编译并执行了第一个C#应用程序:著名的"Hello World"程序.我用这个短短的应用程序给你介绍有关Main方法,它是一个应用程序的入口点,也是出口点.这个方法可以没有返回值或返回一个整数错误级别.如果你的应用程序用参数调用,你可以( 但不必要 )读出并使用它们.
在编译和测试应用程序后,你学到了更多的由Console对象提供的有关输入和输出的方法.对于学习C#而言,它们足以创建出有意义的控制台例子,但用户接口的大部分将是WFC、WinForms或者ASP+(ASP.NET).
本文由中国C#技术学习中心整理 如果你对本文有不明之处请到技术论坛讨论!
|