Main () 方法和其他方法(C# 与 Java)
更新:2007 年 11 月
本节讨论方法和如何通过引用和通过值来传递方法参数。
Main () 方法
每个 C# 应用程序都必须包含一个 Main 方法,以指定从哪里开始执行程序。在 C# 中,Main 的首字母大写,而 Java 使用小写的 main。
Main 只能返回 int 或 void,并有一个代表命令行参数的可选字符串数组参数:
static int Main(string[] args)
{
//...
return 0;
}
对于包含任何传入的命令行参数的字符串数组参数,其工作方式与在 Java 中的工作方式相同。因此,args[0] 指定第一个命令行参数,args[1] 表示第二个参数,依此类推。与 C++ 不同,args 数组不包含 EXE 文件名称。
其他方法
向某个方法传递参数时,可以通过值或通过引用传递参数。值参数简单地采用任意变量的值,在方法中使用。因此,调用代码中的变量值不受对方法内的参数所执行的操作的影响。
而引用参数指向在调用代码中声明的变量,因此,通过引用传递时方法将修改此变量的内容。
通过引用传递
在 Java 和 C# 中,引用对象的方法参数始终都是通过引用传递的,而基元数据类型参数(C# 中的值类型)是通过值传递的。
在 C# 中,若要通过引用传递值类型,需要指定关键字 ref 或 out。这两个关键字的区别在于参数初始化的不同。ref 参数必须在使用前进行初始化,而 out 参数不必在传递前进行显式初始化,并且它将忽略以前的任何值。
ref 关键字
如果希望被调用方法永久更改用作参数的变量的值,请在值类型参数中指定 ref 关键字。这种做法传递的不是调用中所使用的变量的值,而是对此变量本身的引用。方法随后会处理此引用,因此在方法执行期间对此参数所做的更改将保存到用作此方法的参数的原始变量中。
下面的代码在 Add 方法中演示了此功能,其中的第二个 int 参数就是使用 ref 关键字通过引用传递的:
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(10, ref total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
此示例很简单,其输出表明对结果参数所做的更改已在 Add 方法调用所使用的 total 变量中体现出来:
Original value of 'total': 20
Value after calling Add(): 30
这是因为结果参数引用了调用代码中 total 变量所占用的实际内存位置。类的属性不是变量,因此不能直接用作 ref 参数。
调用方法时,ref 关键字必须位于参数前面,并且必须位于方法声明之中。
out 关键字
out 关键字的作用与 ref 关键字非常相似,并且对使用 out 关键字声明的参数所做的更改将在方法之外体现出来。out 关键字与 ref 关键字有两点不同:(1) 方法中将忽略 out 参数的任何初始值;(2) 必须在方法调用过程中为 out 参数赋值:
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value inside method: {0}", result);
result = i + j;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
在此示例中,Add 方法的第三个参数就是使用 out 关键字进行声明的,并且在调用此方法时还需要对该参数使用 out 关键字。输出将为:
Original value of 'total': 20
Value after calling Add(): 110
总而言之,如果想让方法修改现有变量,请使用 ref 关键字;若要返回在方法内生成的值,请使用 out 关键字。当方法为调用代码生成多个结果值时,通常将 out 关键字与方法的返回值结合起来使用。