本章的开头提到过,C#程序是从方法Main()开始执行的。这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void。
虽然显式指定public修饰符是很常见的,因为按照定义,必须在程序外部调用该方法,但我们给该方法指定什么访问级别并不重要,即使把该方法标记为private,它也可以运行。
在编译C#控制台或Windows应用程序时,默认情况下,编译器会在与上述签名匹配的类中查找Main方法,并使这个类方法成为程序的入口。如果有多个Main方法,编译器就会返回一个错误,例如,考虑下面的代码MainExample.cs:
using System;
namespace Wrox.ProCSharp.Basics
{
class Client
{
public static int Main()
{
MathExample.Main();
return 0;
}
}
class MathExample
{
static int Add(int x, int y)
{
return x + y;
}
public static int Main()
{
int i = Add(5,10);
Console.WriteLine(i);
return 0;
}
}
}
上述代码中包含两个类,它们都有一个Main()方法。如果按照通常的方式编译这段代码,就会得到下述错误:
csc MainExample.cs
Microsoft (R) Visual C# .NET Compiler version 8.00.40607.16
for Microsoft (R) .NET Framework version 2.00.40607
Copyright (C) Microsoft Corporation 2001-2003. All rights reserved.
MainExample.cs(7,23): error CS0017: Program 'MainExample.exe' has more than one entry point defined: 'Wrox.ProCSharp.Basics.Client.Main()'
MainExample.cs(21,23): error CS0017: Program 'MainExample.exe' has more than one entry point defined: 'Wrox.ProCSharp.Basics.MathExample.Main()'
但是,可以使用/main选项,其后跟Main()方法所属类的全名(包括命名空间),明确告诉编译器把哪个方法作为程序的入口点:
csc MainExample.cs /main:Wrox.ProCSharp.Basics.MathExample
前面的例子只介绍了不带参数的Main()方法。但在调用程序时,可以让CLR包含一个参数,将命令行参数转送给程序。这个参数是一个字符串数组,传统称为args(但C#可以接受任何名称)。在启动程序时,可以使用这个数组,访问通过命令行传送过来的选项。
下面的例子ArgsExample.cs是在传送给Main方法的字符串数组中迭代,并把每个选项的值写入控制台窗口:
using System;
namespace Wrox.ProCSharp.Basics
{
class ArgsExample
{
public static int Main(string[] args)
{
for (int i = 0; i < args.Length; i++)
{
Console.WriteLine(args[i]);
}
return 0;
}
}
}
通常使用命令行就可以编译这段代码。在运行编译好的可执行文件时,可以在程序名的后面加上参数,例如:
/a
/b
/c