4.4 Main()的返回值和参数
迄今为止,你看到的所有Main()方法采用的都是最简单的声明。在这些Main()方法声明中,不包含任何参数或返回类型。然而,C#支持在执行一个程序时提供命令行参数,并允许从Main()方法返回一个状态标识符。
“运行时”会通过一个string数组参数将命令行参数传给Main()。要获取参数,访问数组就可以了,代码清单4-10对此进行了演示。这个程序的目的是下载指定URL位置的一个文件。第一个命令行参数指定了URL,可选的第二个参数指定了存盘文件名。代码首先是一个switch语句,它根据参数数量(args.Length)采取不同的操作:
(1) 如果有零个参数,就显示一条错误消息,指出必须提供一个URL;
(2) 如果只有一个参数,就根据第一个参数计算出第二个参数;
(3) 如果有第二个参数,表明用户既提供了资源的URL,也提供了下载的目标文件名。
代码清单4-10 将命令行参数传给Main()
using System; class Program if (targetFileName != null) |
代码清单4-10的结果如输出4-4所示。
输出4-4
>Downloader.exe |
假如成功地获得了目标文件名,就可以用它来保存下载的文件。否则,应该显示帮助文本。Main()方法还会返回一个int,而不是像往常那样返回一个void。返回值对于Main()声明来说是可选的。但是,假如使用了它,程序就可以将一个状态码返回给调用者(调用者可以是一个脚本,也可以是一个批处理文件)。根据约定,一个非零的返回值代表一个错误。
虽然所有命令行参数都可以通过一个字符串数组传给Main(),但我们有时候可能需要从一个不同于Main()的方法中访问那些参数。在这种情况下,可以使用System.Environment.GetCommand- LineArgs()方法。该方法采取和Main(string[] args)将参数传给Main()一样的方式来返回命
令行参数。
高级主题:消除多个Main()方法的歧义
假如一个程序包含的两个类都有Main()方法,那么可以在命令行上指定具体是哪一个类包含了程序的入口点。利用csc.exe的/m或/main选项开关,可以指定包含Main()的那个类的完全限定类名。
初学者主题:调用栈和调用点
代码执行时,方法可能调用其他方法,其他方法可能调用更多的方法……依此类推。在代码清单4-4展示的简单情况中,Main()调用了GetUserInput(),GetUserInput()调用了System. Console.ReadLine(),而System.Console.ReadLine()在内部会调用更多的方法。这种调用嵌套调用的情况,我们称为调用栈(call stack)。随着程序复杂程度的提高,每个方法调用另一个方法时,这个调用栈都会变大。然而,当调用结束时,调用栈会发生收缩,直到调用另一系列的方法。我们用栈展开(stack unwinding)这个词来描述从调用栈中删除调用的过程。栈展开的顺序通常与方法调用的顺序相反。一个方法调用完毕之后,会将控制权返回给调用点(call site),也就是最初发出方法调用的那个位置。
| 回书目 上一节 下一节 |