本章内容:
方法的结构
方法体内部的代码执行
局部变量
局部常量
控制流
方法调用
返回值
返回语句和void方法
局部函数
参数
值参数
引用参数
引用类型作为值参数和引用参数
输出参数
参数数组
参数类型总结
方法重载
命名参数
可选参数
栈帧
递归
可选参数
C#还允许使用可选参数〈optional parameter)。所谓可选参数就是可以在调用方法的时候包
含这个参数,也可以省略它。
为了表明某个参数是可选的,你需要在方法声明中为该参数提供默认值。指定默认值的语法
和初始化局部变量的语法一样,如下面代码的方法声明所示。在代码中,
- 形参b的默认值设置成3;
- 因此,如果在调用方法的时候只有一个参数,方法会使用3作为第二个参数的初始值。
csharp
class MyClass
{
public int Calc(int a,int b=3)
{
return a+b;
}
static void Main()
{
MyClass mc=new MyClass();
int r0=mc.Calc(5,6); //使用显式值
int r1=mc.Calc(5); //为b使用默认值
Console.WriteLine($"{r0},{r1}");
}
}
对于可选参数的声明,我们需要知道如下几个重要事项。
- 不是所有的参数类型都可以作为可选参数。图6-14列出了何时可以使用可选参数。
- 只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。
- 只有在默认值是null的时候,引用类型才可以用作可选参数。

- 所有必填参数(required paramenter)必须在可选参数声明之前声明。如果有params参数,
必须在所有可选参数之后声明。图6-15演示了这种语法顺序。

在之前的示例中我们已经看到了,可以在方法调用的时候省略相应的实参,从而为可选参数
使用默认值。但是,不能随意省略可选参数的组合,因为在很多情况下这么做会导致使用哪些可
选参数变得不明确。规则如下。
- 你必须从可选参数列表的最后开始省略,一直到列表开头。
- 也就是说,你可以省略最后一个可选参数,或是最后"个可选参数,但是不能随意选择省略任意的可选参数,省略必须从最后开始。
csharp
class MyClass
{
public int Calc(int a=2,int b=3,int c=4)
{
return (a+b)*c;
}
static void Main()
{
MyClass mc=new MyClass();
int r0=mc.Calc(5,6,7); //使用所有的显式值
int r1=mc.Calc(5,6); //为C使用默认值
int r2=mc.Calc(5); //为b和c使用默认值
int r3=mc.Calc(); //使用所有 的默认值
}
}
如果需要随意省略可选参数列表中的可选参数,而不是从列表的最后开始,那么必须使用可
选参数的名字来消除赋值的歧义。在这种情况下,你需要结合利用命名参数和可选参数特性。下
面的代码演示了位置参数、可选参数和命名参数的这种用法。
csharp
class MyClass
{
double GetCylinderVolume(double radius=3.0,double height=4.0)
{
return 3.1416*radius*radius*height;
}
static void Main()
{
MyClass mc=new MyClass();
double volume;
volume=mc.GetCylinderVolume(3.0,4.0);
Console.WriteLine("Volume="+volume);
volume=mc.GetCylinderVolume(radius:2.0);
Console.WriteLine("Volume="+volume);
volume=mc.GetCylinderVolume();
Console.WriteLine("Volume="+volume);
}
}