本章最后一个练习将尝试实现获取可选参数的方法,并用命名参数来调用它们。还要测试一些常见的例子,了解C#编译器如何解析涉及可选参数和命名参数的方法调用。
定义并调用获取可选参数的方法1. 在Visual Studio 2010中打开“文档”文件夹下的\Microsoft Press\Visual CSharp Step byStep\Chapter 3\DailyRate Using Optional Parameters子文件夹中的DailyRate项目。
2. 在“解决方案资源管理器”中,双击Program.cs文件,在“代码和文本编辑器”窗口中显示代码。
3. 在Program类中,在run方法下方添加calculateFee方法。它和上一组练习中实现的方法相似,只是它获取两个具有默认值的可选参数。方法还打印一条消息,指出调用的是哪个版本的calculateFee。(将在后续的步骤中添加这个方法的重载的实现。)
private double calculateFee(double dailyRate = 500.0, int noOfDays = 1)
{
Console.WriteLine("calculateFee using two optional parameters");
return dailyRate * noOfDays;
}
4.在Program类中添加calculateFee方法的另一个实现,如下所示:这个版本获取一个可选参数(double dailyRate)。方法主体计算并返回一天的收费金额。
private double calculateFee(double dailyRate = 500.0)
{
Console.WriteLine("calculateFee using one optional parameter");
intdefaultNoOfDays = 1;
return dailyRate * defaultNoOfDays;
}
5.添加calculateFee的第三个实现。这个版本不获取任何参数,使用硬编码的每日费率(400元)和收费天数(1天)。
private double calculateFee()
{
Console.WriteLine("calculateFee using hardcoded values");
double defaultDailyRate = 400.0;
int defaultNoOfDays = 1;
return defaultDailyRate * defaultNoOfDays;
}
6.在run方法中添加以下语句来调用calculateFee并显示结果:
public void run()
{
double fee = calculateFee();
Console.WriteLine("Fee is {0}", fee);
}
7.在“调试”菜单中,单击“开始执行(不调试)”来生成并运行程序。程序在一个控制台窗口中运行,并显示以下消息:
calculateFee using hardcoded values
Fee is 400
run方法调用的是不获取任何参数的calculateFee版本,而不是获取可选参数的任何版本。这是由于该版本和方法调用最匹配。
按任意键关闭控制台窗口并返回Visual Studio。
8.在run方法中修改调用calculateFee的语句(加粗的地方):
public void run()
{
double fee = calculateFee(650.0);
Console.WriteLine("Fee is {0}", fee);
}
9.在“调试”菜单中,单击“开始执行(不调试)”来生成并运行程序。程序在一个控制台窗口中运行,并显示以下消息:
calculateFee using one optional parameter
Fee is 650
这一次,run方法调用的是获取一个可选参数的calculateFee版本。同样,这是和方法调用最匹配的版本:
按任意键关闭控制台窗口并返回Visual Studio。
10.在run方法中,再次修改调用calculateFee的语句:
public void run()
{
double fee = calculateFee(500.0, 3);
Console.WriteLine("Fee is {0}", fee);
}
11.在“调试”菜单中,单击“开始执行(不调试)”来生成并运行程序。程序在一个控制台窗口中运行,并显示以下消息:
calculateFee using two optional parameters
Fee is 1500
run方法这次调用的是获取两个可选参数的calculateFee版本。
按任意键关闭控制台窗口并返回Visual Studio。
12.在run方法中修改调用calculateFee的语句,通过名称指定dailyRate参数的值:
public void run()
{
double fee = calculateFee(dailyRate : 375.0);
Console.WriteLine("Fee is {0}", fee);
}
13.在“调试”菜单中,单击“开始执行(不调试)”来生成并运行程序。程序在一个控制台窗口中运行,并显示以下消息:
calculateFee using one optional parameter
Fee is 375
和步骤8一样,run方法调用的是获取一个可选参数的calculateFee版本。虽然使用了命名参数,但编译器对方法调用进行解析的方式没有发生改变,不会选择获取两个可选参数的版本。
按任意键关闭控制台窗口并返回Visual Studio。
14.在run方法中修改调用calculateFee的语句,通过名称指定noOfDays参数的值:
public void run()
{
double fee = calculateFee(noOfDays : 4);
Console.WriteLine("Fee is {0}", fee);
}
15.在“调试”菜单中,单击“开始执行(不调试)”来生成并运行程序。程序在一个控制台窗口中运行,并显示以下消息:
calculateFee using two optional parameters
Fee is 2000
这一次,run调用的是获取两个可选参数的calculateFee版本。在方法调用中,省略了第一个参数(dailyRate),并通过名称指定了第二个参数的值。获取两个可选参数的calculateFee是唯一和调用匹配的版本。
按任意键关闭控制台窗口并返回Visual Studio。
16.修改获取两个可选参数的calculateFee方法的实现。将第一个参数的名称更改为theDailyRate,并更新return语句,如以下加粗的代码所示:
private double calculateFee(double theDailyRate= 500.0, int noOfDays = 5)
{
Console.WriteLine("calculateFee using two optional parameters");
return theDailyRate* noOfDays;
}
17.在run方法中,修改调用calculateFee的语句,通过名称指定theDailyRate参数的值:
public void run()
{
double fee = calculateFee(theDailyRate : 375);
Console.WriteLine("Fee is {0}", fee);
}
18.在“调试”菜单中,单击“开始执行(不调试)”来生成并运行程序。程序在一个控制台窗口中运行,并显示以下消息:
calculateFee using two optional parameters
Fee is 1875
步骤12指定的是参数名是dailyRate而非theDailyRate,所以run方法会调用获取一个可选参数的那个版本的calculateFee。但这一次,run方法调用的是获取两个可选参数的calculateFee版本。在本例中,使用命名参数改变了编译器对方法调用进行解析的方式。如果提供一个命名参数,编译器会将参数名和方法声明中指定的参数名比较,选择参数名称匹配的方法。
按任意键关闭控制台窗口并返回Visual Studio。
本章讲述了如何定义方法来实现一个具名的代码块。你学习了如何向方法传递参数,以及如何从方法返回数据。另外,还知道了如何调用方法、传递参数并获取返回值。学习了如何通过不同的参数列表来重载方法,还知道了变量的作用域如何影响它的作用范围。然后,我们用Visual Studio 2010调试器对代码进行单步调试。最后,学习了如何写方法来获取可选参数,以及如何使用命名参数来调用方法。
如果想继续学习下一章,请保持Visual Studio 2010的运行状态,然后阅读第4章。
如果想立即退出Visual Studio 2010,请在“文件”菜单上选择“退出”命令。如果看到“保存”对话框,单击“是”来保存项目。
第3章快速参考
目 标 |
操 作 |
声明方法 |
在一个类的内部编写方法。例如:
int addValues(int leftHandSide, int rightHandSide)
{
...
} |
从方法内部返回一个值 |
在方法内部写一个return语句。例如:
return leftHandSide + rightHandSide; |
不等方法结束就从方法返回 |
在方法中写一个return语句:
return; |
调用方法 |
写一个方法名,在圆括号中添加所有必要的实参。例如:
addValues(39, 3); |
使用“生成方法存根向导” |
右击一个方法调用,从弹出菜单中选择“生成方法存根(Stub)” |
显示“调试”工具栏 |
从菜单栏中选择“视图”|“工具栏”,勾选“调试” |
跳入一个方法并逐语句进行调试(Step into) |
单击“调试”工具栏中的“逐语句”按钮,或者从菜单栏中选择“调试”|“逐语句” ,或者按F11 |
跳出一个方法,忽略对方法中的其他语句的调试,一路执行到方法尾(Step out) |
单击“调试”工具栏中的“跳出”按钮,或者从菜单栏中选择“调试”|“跳出” ,或者按Shift+F11组合键 |
直接执行一个方法而不对其进行调试(Step over) |
单击“调试”工具栏中的“逐过程”按钮,或者从菜单栏中选择“调试”|“逐过程” ,或者按F10功能键 |
为方法指定一个可选参数 |
在方法声明中,为参数提供一个默认值。例如:
void optMethod(int first, double second = 0.0, string third = "Hello")
{
...
} |
利用命名参数向方法提供一个实参 |
在方法调用中指定参数名。例如:
optMethod(first : 100, third : "World"); |
I