您所在的位置: 首页>>读书频道>>设计开发>>.Net系列>>

4.4 Main()的返回值和参数

http://book.51cto.com  2008-07-19 13:27  (美)米凯利斯(Michaelis, M.)著/周靖译  人民邮电出版社  我要评论(0)
  • 摘要:《C#本质论》第4章方法和参数,这一章讨论了如何将语句组合成一个方法,除此之外,还讨论了如何调用一个方法,其中包括如何将数据传给方法以及从方法中接收数据,本小节为大家介绍Main()的返回值和参数。
  • 标签:C#  本质论  参数  C#本质论

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;
using System.IO;
using System.Net;

class Program
{
static int Main(string[] args)
{
int result;
string targetFileName = null;
switch (args.Length)
{
case 0:
// No URL specified, so display error.
Console.WriteLine(
"ERROR: You must specify the "
+ "URL to be downloaded");
break;
case 1:
// No target filename was specified.
targetFileName = Path.GetFileName(args[0]);
break;
case 2:
targetFileName = args[1]; 
break;
}

if (targetFileName != null)
{
WebClient webClient = new WebClient();
webClient.DownloadFile(args[0], targetFileName); 
result = 0;
}     
else
{
Console.WriteLine(
"Downloader.exe <URL> <TargetFileName>");
result = 1;
}
return result;
}
}

代码清单4-10的结果如输出4-4所示。

输出4-4

>Downloader.exe
ERROR: You must specify the URL to be downloaded
Downloader.exe <URL> <TargetFileName>

假如成功地获得了目标文件名,就可以用它来保存下载的文件。否则,应该显示帮助文本。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),也就是最初发出方法调用的那个位置。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
上一篇: 4.3 using指令 下一篇: 4.5.1 值参数
C#实用基础教程
C#技术开发指南
深入Vista应用程序开发
Ruby on Rails 社区网站开发
ASP.NET从入门到精通
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有