“方法”是包含一系列语句的代码块。在 C# 中,每个执行指令都是在方法的上下文中完成的。
方法在类或结构中声明,声明时,声明时需要指定访问级别、返回值、方法名称以及任何方法参数。方法参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。下面的类包含三个方法:
C# | 复制代码 |
---|
class Motorcycle
{
public void StartEngine() { }
public void AddGas(int gallons) { }
public int Drive(int miles, int speed) { return 0; }
}
|
调用对象的方法类似于访问字段。在对象名称之后,依次添加句点、方法名称和括号。参数在括号内列出,并用逗号隔开。因此,可以如下所示来调用 Motorcycle
类的方法:
C# | 复制代码 |
---|
Motorcycle moto = new Motorcycle();
moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);
|
方法参数
如前面的代码段所示,如果要将参数传递给方法,只需在调用方法时在括号内提供这些参数即可。对于被调用的方法,传入的变量称为“参数”。
方法所接收的参数也是在一组括号中提供的,但必须指定每个参数的类型和名称。该名称不必与参数相同。例如:
C# | 复制代码 |
---|
public static void PassesInteger()
{
int fortyFour = 44;
TakesInteger(fortyFour);
}
static void TakesInteger(int i)
{
i = 33;
}
|
在这里,一个名为 PassesInteger
的方法向一个名为 TakesInteger
的方法传递参数。在 PassesInteger
内,该参数被命名为 fortyFour
,但在 TakeInteger
中,它是名为 i
的参数。此参数只存在于 TakesInteger
方法内。其他任意多个变量都可以命名为 i
,并且它们可以是任何类型,只要它们不是在此方法内部声明的参数或变量即可。
注意,TakesInteger
将新值赋给所提供的参数。有人可能认为一旦 TakeInteger
返回,此更改就会反映在 PassesInteger
方法中,但实际上变量 fortyFour
中的值将保持不变。这是因为 int 是“值类型”。默认情况下,将值类型传递给方法时,传递的是副本而不是对象本身。由于它们是副本,因此对参数所做的任何更改都不会在调用方法内部反映出来。之所以叫做值类型,是因为传递的是对象的副本而不是对象本身。传递的是值,而不是同一个对象。
有关传递值类型的更多信息,请参见传递值类型参数(C# 编程指南)。有关 C# 中的值类型的列表,请参见值类型表(C# 参考)。
这与“引用类型”不同,后者是按引用传递的。将基于引用类型的对象传递到方法时,不会创建对象的副本,而是创建并传递对用作方法参数的对象的引用。因此,通过此引用所进行的更改将反映在调用方法中。引用类型是使用 class 关键字创建的,如下所示:
C# | 复制代码 |
---|
public class SampleRefType
{
public int value;
}
|
现在,如果将基于此类型的对象传递给方法,它将按引用传递。例如:
C# | 复制代码 |
---|
public static void TestRefType()
{
SampleRefType rt = new SampleRefType();
rt.value = 44;
ModifyObject(rt);
System.Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
obj.value = 33;
}
|
此示例的效果本质上与前一示例相同。但是,由于使用的是引用类型,因此 ModifyObject
所做的更改反映在 TestRefType
方法中创建的对象中。因此,TestRefType
方法将显示值 33。
有关更多信息,请参见传递引用类型参数(C# 编程指南)和引用类型(C# 参考)。
返回值
方法可以向调用方返回值。如果返回类型(方法名称前列出的类型)不是 void,则方法可以使用 return 关键字来返回值。如果语句中 return 关键字的后面是与返回类型匹配的值,则该语句将该值返回给方法调用方。return 关键字还会停止方法的执行。如果返回类型为 void,则可使用没有值的 return 语句来停止方法的执行。如果没有 return 关键字,方法执行到代码块末尾时即会停止。具有非 void 返回类型的方法才能使用 return 关键字返回值。例如,下面的两个方法使用 return 关键字来返回整数:
C# | 复制代码 |
---|
class SimpleMath
{
public int AddTwoNumbers(int number1, int number2)
{
return number1 + number2;
}
public int SquareANumber(int number)
{
return number * number;
}
}
|
若要使用从方法返回的值,调用方法可以在本来使用同一类型的值就已足够的任何位置使用方法调用本身。还可以将返回值赋给变量:例如,下面的两个代码示例可实现相同的目的:
C# | 复制代码 |
---|
int result = obj.AddTwoNumbers(1, 2);
obj.SquareANumber(result);
|
C# | 复制代码 |
---|
obj.SquareANumber(obj.AddTwoNumbers(1, 2));
|
使用中间变量(本例中为 result
)来存储值。这有助于增强代码的可读性,如果要多次使用该值,则可能必须使用中间变量。
有关更多信息,请参见 return(C# 参考)。
C# 语言规范
请参见