本章旨在教会你:
● 声明和调用方法
● 向方法传递信息
● 从方法返回信息
● 定义局部作用域和类作用域
● 使用集成调试器来逐语句和逐过程地调试方法
第2章讲述了如何声明变量,如何使用操作符来创建表达式,以及如何利用优先级和结合性来控制含有多个操作符的表达式的求值顺序。本章将开始探讨方法。还将介绍如何利用实参和形参向方法传递信息,以及如何利用return语句从方法返回信息。最后还将介绍如何使用Microsoft Visual Studio 2010内部集成的调试器对方法进行调试。在需要跟踪方法的执行情况时,这方面的信息十分有用,因为方法可能并不像我们希望的那样工作。
3.1 创建方法方法(method)是一个具名的语句序列。如果以前用过其他编程语言,如C或Visual Basic等,就可以将方法视为与函数或者子程序相似的东西。每个方法都有一个名称和一个主体。方法名应该是一个有意义的标识符,它用英语描述了方法的用途(例如用于计算所得税的一个方法可以叫calculateIncomeTax)。方法主体包含方法被调用时实际执行的语句。此外,还可以向方法提供一些数据供处理,并可让它返回一些信息(通常是处理结果)。方法是一种基本的、功能强大的编程机制。
3.1.1 声明方法C#方法的语法格式如下:
returnTypemethodName( parameterList)
{
// 这里添加方法主体语句
}
● returnType(返回类型)是一个类型名,它指定了方法返回的数据是什么类型。这可以是任何类型,如int或string。如果要写一个不返回值的方法,必须用关键字void来取代returnType。
● methodName(方法名)是调用方法时使用的名称。方法名所遵循的标识符命名规则和变量名一样。例如,addValues是一个有效的方法名,而add$Values是无效的。目前,应该为方法名采用camelCase命名风格,而且应该以一个动词开头,使方法的用途更加一目了然,例如displayCustomer(显示客户)。
● parameterList(参数列表)是可选的,它描述了允许传给方法的数据的类型和名称。在圆括号内填写参数列表时,要像声明变量时那样,先写参数的类型名,再写参数名。如果方法有两个或者更多的参数,必须用逗号来分隔它们。
● 方法主体语句是调用方法时要执行的代码。它们必须放在起始大括号({)与结束大括号(})之间。
重要提示:C,C++和Microsoft Visual Basic程序员请注意,C#不支持全局方法。所有方法都必须在一个类的内部,否则代码无法编译。
以下是一个名为addValues的方法的定义,它返回一个int类型的值,并可接收两个int类型的参数,分别名为leftHandSide和rightHandSide。
int addValues(int leftHandSide, int rightHandSide)
{
// ...
//这里添加方法主体语句
// ...
}
提示:
必须显式指定任何一个参数的类型和整个方法的返回类型。不能使用var关键字。
以下是一个名为showResult的方法的定义,它不返回任何值,并接收一个名为answer的int参数:
void showResult(int answer)
{
// ...
}
注意:
要用void来指明方法不返回任何值。
重要提示:Visual Basic程序员请注意,C#不允许使用不同的关键字来区分一个要返回值的方法(VB中称为函数)和一个不返回值的方法(VB中称为过程、子例程或者子程序)。在C#中,要么显式指定一个返回类型,要么指定void。
3.1.2 从方法返回数据如果希望一个方法返回数据(换言之,它的返回类型不是void),必须在方法内部写一个return语句。为此,请先写关键字return,再在它的后面添加一个表达式(这个表达式将负责计算返回的值),最后写一个分号。表达式的类型必须与方法指定的返回类型相同。也就是说,假如函数返回int值,则return语句必须返回int,否则程序无法编译。下面是一个例子:
int addValues(int leftHandSide, int rightHandSide)
{
// ...
return leftHandSide +rightHandSide;
}
return应放在方法尾部,因为它会导致方法结束。return后的任何语句都不会被执行(如果非要在return语句之后放其他语句,编译器会发出警告)。
假如不希望方法返回数据(换言之,返回类型为void),可以利用return语句的一个变体立即从方法中退出。为此,请先写关键字return,然后紧跟一个分号。如下所示:
void showResult(int answer)
{
// 显示answer
...
return;
}
假如方法不返回任何数据,甚至可以省略return语句,因为一旦执行到方法尾部的结束大括号(}),方法就会自动结束。不过,虽然这是一种常见的写法,但并不是一个良好的编程风格。
在下面的练习中,你将研究第2章的MathsOperators应用程序的另一个版本。在新版本中,要用一些小方法来改进它。
分析方法定义1. 如果Visual Studio 2010尚未运行,请启动它。
2. 打开“文档”文件夹中的\Microsoft Press\Visual CSharp Step by Step\Chapter 3\Methods子文件夹中的Methods项目。
3. 在“调试”菜单中选择“开始执行(不调试)”(或按组合键Ctrl+F5)。 Visual Studio 2010将开始生成并运行应用程序。
4. 重新熟悉一下这个应用程序,体会它是如何工作的。最后单击Quit(退出)按钮。
5. 在“代码和文本编辑器”窗口中显示MainWindow.xaml.cs文件的代码。
6. 在“代码和文本编辑器”窗口中,找到addValues方法,如下所示:
private int addValues(int leftHandSide, int rightHandSide)
{
expression.Text = leftHandSide.ToString() + " + " + rightHandSide.ToString();
return leftHandSide + rightHandSide;
}
addValues方法包含两个语句。第一个语句在窗体上的expression文本框中显示要计算的算式。leftHandSide 和rightHandSide这两个参数的值被转换成字符串(使用第2章介绍过的ToString方法),并在两者之间用一个加号(+)来连接。 第二个语句使用操作符+来计算leftHandSide和rightHandSide这两个int变量之和,并返回结果。记住,两个int值相加得到的结果也是int值,所以addValues方法的返回类型是int。 subtractValue, multiplyValue, divideValue和reminderValue等方法采用了类似的模式。
7. 在“代码和文本编辑器”窗口中找到showResult方法,如下所示:
private void showResult(int answer)
{
result.Text = answer.ToString();
}
这个方法只有一个语句,作用是在result文本框中显示answer的字符串形式。由于不返回值,所以方法的返回类型是void。
提示:方法的最小长度没有限制。假如一个方法有助于避免重复,并使你的程序更可读,就应该毫不犹豫地使用方法——不管这个方法有多小。同样地,方法的最大长度也没有限制。但是,应该保持方法代码的精炼,足够完成一项工作就可以了。如果一个方法的大小超过了一个屏幕,就应该考虑把它分解成一些更小的方法,以增强可读性。
3.1.3 调用方法方法的终极目的就是为了被调用!我们用方法名来调用一个方法,要求它执行既定的任务。如果方法要求获取数据(由它的参数指定),就必须提供这些数据。如果方法要返回数据(由它的返回类型指定),就应该以某种方式来捕捉它返回的数据。
指定方法调用语法C#方法调用的语法如下:
result = methodName (argumentList)
● methodName(方法名)必须与要调用的方法的名称完全一致。记住,C#语言是区分大小写的。
● result =子句是可选的。如果指定,result变量将包含方法的返回值。如果返回类型是void(即不返回任何值),就必须在语句中省略result =子句。如果不指定result = 子句,而且方法返回一个值,那么方法虽然会运行,但返回值会被丢弃。
● argumentList(实参列表)提供了将由方法接收的数据。必须为每个参数(形参)提供一个参数值(实参),而且每个实参都必须兼容于它对应的形参的类型。如果方法有两个或者更多的参数,那么在提供实参时,必须用逗号来分隔不同的实参。
重要提示:每个方法调用中都必须包含一对圆括号,即使调用的是无参方法。
为了加深印象,下面再次列出了addValues方法:
int addValues(int leftHandSide, int rightHandSide)
{
// ...
}
addValues方法有两个int参数,所以在调用该方法时,必须提供两个以逗号分隔的int实参,如下所示:
addValues(39, 3); // 正确方式
还可以将39和3替换成int变量名。这些int变量的值会作为实参传给方法,如下所示:
int arg1 = 99;
int arg2 = 1;
addValues(arg1, arg2);
下面列举了错误的addValues调用方式:
addValues; // 编译时错误,无圆括号
addValues(); // 编译时错误,无足够实参
addValues(39); // 编译时错误,无足够实参
addValues("39", "3");// 编译时错误,类型错误
addValues方法将返回一个int值。这个int值可以在能够使用一个int值的任何地方使用。例如:
result = addValues(39, 3); // 作为赋值操作符的右操作数
showResult(addValues(39, 3)); // 作为实参传给另一个方法调用
在下面的练习中,我们将继续使用Methods应用程序。这一次,我们将分析一些方法调用。
分析方法调用1. 返回Methods项目。如果是刚完成上一个练习,该项目应该已经在Visual Studio 2010中打开;否则,请从“文档”文件夹的\Microsoft Press\Visual CSharp Step by Step\Chapter 3\Methods子文件夹中打开它。
2. 在“代码和文本编辑器”窗口中显示MainWindow.xaml.cs文件的代码。
3. 找到calculateClick方法,观察try{之后的两个语句(try语句的作用将在第6章讨论):
int leftHandSide = System.Int32.Parse(lhsOperand.Text);
int rightHandSide = System.Int32.Parse(rhsOperand.Text);
这两个语句声明了两个int变量,分别称为leftHandSide和rightHandSide。然而,最有意思的是变量的初始化方式。在这两个语句中,都调用了System.Int32类的Parse方法(System是一个命名空间,Int32是该命名空间中的一个类的名称)。你以前见过这个方法;它获取一个string实参,并把它转换成一个int值。执行了这两个语句之后,用户在窗体上的lhsOperand和rhsOperand文本框中输入的任何内容都会转换成int值。
4. 观察calculateClick方法的第4个语句(在if语句和另一个起始大括号之后):
calculatedValue= addValues(leftHandSide, rightHandSide);
该语句调用addValues方法,将leftHandSide 和rightHandSide变量的值作为方法的实参来传递。addValues方法的返回值将存储到calculatedValue变量中。
5. 继续观察下一个语句:
showResult(calculatedValue);
该语句调用showResult方法,将calculatedValue变量的值作为方法的实参来传递。showResult方法不返回值。
6. 在“代码和文本编辑器”窗口中,找到前面讨论过的showResult方法。该方法只有一个语句,如下所示:
result.Text = answer.ToString();
注意:
即使没有参数,调用ToString方法时也使用了圆括号。
提示:为了调用其他对象的方法,可以在方法名之前附加对象名前缀。在上例中,表达式answer.ToString()调用的就是answer对象的ToString方法。N 愰bh茓&{鰁臺{榰惇_錘N韹誰膲R<