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