C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域 C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域

本章内容

1. 声明和调用方法
2. 向方法传递信息
3. 从方法返回信息
4. 定义局部作用域和类作用域
5. 使用集成调试器来逐语句和逐过程地调试方法

3.1 创建方法

方法(method)是一个具名的语句序列。方法名应该是一个有意义的标识符,方法主体包含方法被调用时实际执行的语句。

3.1.1 声明方法

C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
1. returnType(返回类型)是一个类型名,它指定了方法返回的数据是什么类型。如果要写一个不返回值的方法,必须用关键字 void来取代 returnType。
2. methodName(方法名)是调用方法时使用的名称。
3. parameterList(参数列表)是可选的,它描述了允许传给方法的数据的类型和名称。在圆括号内填写参数列表时,要像声明变量时那样,先写参数的类型名,再写参数
名。如果方法有两个或者更多的参数,必须用逗号来分隔它们。
4. 方法主体语句是调用方法时要执行的代码。它们必须放在起始大括号({)与结束大括号(})之间。
重要提示:C,C++和 Microsoft Visual Basic 程序员请注意,C#不支持全局方法。所有方法都必须在一个类的内部,否则代码无法编译。
提示:必须显式指定任何一个参数的类型和整个方法的返回类型。不能使用 var 关键字。
重要提示:Visual Basic 程序员请注意,C#不允许使用不同的关键字来区分一个要返回值的方法(VB 中称为函数)和一个不返回值的方法(VB 中称为过程、子例程或者子程序)。在 C#中,要么显式指定一个返回类型,要么指定 void。

3.1.2 从方法返回数据

如果希望一个方法返回数据(换言之,它的返回类型不是 void),必须在方法内部写一个 return语句。
return 应放在方法尾部,因为它会导致方法结束。return 后的任何语句都不会被执行(如果非要在 return 语句之后放其他语句,编译器会发出警告)。
假如不希望方法返回数据(换言之,返回类型为 void),可以利用 return 语句的一个变体立即从方法中退出。为此,请先写关键字 return,然后紧跟一个分号。
提示:方法的最小长度没有限制。假如一个方法有助于避免重复,并使你的程序更可读,就应该毫不犹豫地使用方法——不管这个方法有多小。同样地,方法的最大长度也没有限制。但是,应该保持方法代码的精炼,足够完成一项工作就可以了。如果一个方法的大小超过了一个屏幕,就应该考虑把它分解成一些更小的方法,以增强可读性。

3.1.3 调用方法

C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
1. methodName(方法名)必须与要调用的方法的名称完全一致。记住,C#语言是区分大小写的。
2. result =子句是可选的。如果指定,result 变量将包含方法的返回值。如果返回类型是 void(即不返回任何值),就必须在语句中省略 result =子句。如果不指定 result =子句,而且方法返回一个值,那么方法虽然会运行,但返回值会被丢弃。
3. argumentList(实参列表)提供了将由方法接收的数据。必须为每个参数(形参)提供一个参数值(实参),而且每个实参都必须兼容于它对应的形参的类型。如果方法有两个或者更多的参数,那么在提供实参时,必须用逗号来分隔不同的实参。
重要提示:每个方法调用中都必须包含一对圆括号,即使调用的是无参方法。

3.2 使用作用域

我们知道可以在方法内部创建变量。这种变量的有效期(生存期)起始于它的定义位置,结束于方法结束的时候。在同一个方法内,后续的语句都可以使用这些变量(变量在创建之后才能使用)。方法执行完毕后,这些变量也会随之消失。
一个变量的作用域或范围(scope)是指该变量能发挥作用的一个程序区域。除了变量有作用域,方法也有作用域。一个标识符(不管它代表变量还是方法)的作用域始于声明该标识符的那个位置。

3.2.1 定义局部作用域

界定方法主体的{与}定义了一个作用域。
局部变量(local variable),因为它们局限于声明它们的那个方法,不在其他任何方法的范围中。只能由那个方法内部的代码访问。一旦方法结束,它们也会随之消失。

3.2.2  定义类的作用域

界定类主体的{和}也定义了一个作用域。在类的主体中(但不能在一个方法中)声明的任何变量都具有那个类的作用域。在 C#术语中,开发者使用字段(field)一词来描述由一个类定义的变量。和局部变量相反,可以使用字段在不同的方法之间共享信息。
在方法中,一个变量必须先声明再使用。但字段稍有不同,一个字段可以在类的任何位置定义。在编译器生成的 IL 代码中,字段实际还是先声明并初始化,然后再使用的。

3.2.3 重载方法

如果两个标识符同名,而且是在同一个作用域中声明的,就可以说它们被重载(overloaded)了。
如果需要针对不同的数据类型执行相同的操作,重载就是一项十分有用的技术。如果一个方法有多个不同的实现,而且每个实现都有不同的参数集,就可以考虑重载该方法。这样一来,每个版本都有相同的方法名,但有不同的参数数量或者/以及不同的参数类型。利用这个功能,在调用一个方法时,可以提供一个以逗号分隔的实参列表,而编译器将根据这些实参的数量和类型来选择一个匹配的重载版本。但要注意,虽然可以重载一个方法的参数,但不能重载方法的返回类型。也就是说,不能声明只是返回类型有区别的两个方法。
注意:
Console.Write 方法不会在消息之后输出一个换行符。
ReadLine 方法是与 WriteLine 配对的一个方法;它读取用户的键盘输入,并在用户按 Enter 键时结束读取。用户输入的文本会作一个 String 值返回。
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域

程序测试

C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
提示:
按 F11 键的作用等同于单击调试工具栏中的逐语句按钮。
按 F10 键的作用等同于单击调试工具栏中的逐过程按钮。
按 Shift + F11 组合键的作用等同于单击调试工具栏中的跳出按钮。

3.4 使用可选参数和命名参数

C#和其他面向.NET Framework 的语言的一项关键的能力就是能够与使用其他技术开发的应用程序和组件进行互操作。Microsoft Windows 使用的一项主要技术是组件对象模型(Component Object Model,COM)。COM 不支持重载方法;相反,它允许方法获取可选参数。为了方便在 C#解决方案中集成 COM 库和组件,C#现在也提供了对可选参数的支持。
可选参数在其他情况下也很有用。有的时候,参数类型差异不足以使编译器区分两个不同的实现,造成无法使用重载技术。在这个时候,可选参数能提供一个简单、好用的解决方案。

3.4.1 定义可选参数

为了指定一个参数是可选的,可以在定义方法时为该参数提供一个默认值。所有可选的参数都只能放在必须的参数之后。
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域

3.4.2 传递命名参数

C#默认根据每个实参在方法调用中的位置判断它们对应于哪个形参。C#还允许按照名称指定参数。
为了将一个实参作为命名参数来传递,必须输入参数名,一个冒号,然后是要传递的值。
例如:
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
利用命名参数,实参就可以按任意顺序传递。
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
允许省略实参。
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
还可以兼按位置和名称来指定实参。如果使用这个技术,必须先指定好所有按照位置的实参,再指定命名的实参
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域

3.4.3 消除可选参数和命名参数的歧义

例如:
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
如果试图调用 optMethod 方法,同时忽略和它的一个或多个可选参数对应的实参,就可能出现问题:
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
调用最匹配的那个版本。所以,最后选择的是获取 3 个参数的版本。
再看这一例:
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
C# 2010 从入门到精通 学习笔记2 第3章 方法和作用域
optMethod 的两个版本都不能完全匹配提供的实参列表。编译器认为这是一个存在歧义的方法调用,所以不允许编译应用程序。