练习 - 方法的返回值和参数

已完成

在上一单元中,你使用“掷骰子”编码方案说明了有状态(实例)和无状态(静态)方法之间的区别。 这种相同的方案可以帮助你了解有关调用方法的其他重要概念。 例如:

  • 处理方法的返回值。
  • 方法参数以及将自变量传递给方法。
  • 选择方法的重载版本。

返回值

一些方法旨在完成其功能并“安静地”结束。 换言之,它们在完成时不返回值。 这些方法称为 void 方法

其他方法旨在完成后返回值。 返回值通常是某个操作的结果。 返回值是方法与调用方法的代码进行通信的主要方式。

你已看到,Random.Next() 方法返回 int 类型,其中包含随机生成的数字的值。 但是,可将方法设计为返回任何数据类型,甚至是另一个类。 例如,String 类具有一些可返回字符串的方法,一些可返回整数的方法,以及一些可返回布尔值的方法。

调用可返回值的方法时,通常需将返回值分配给变量。 这样,你稍后可以在代码中使用该值。 在骰子方案中,你已将 Random.Next() 的返回值分配给 roll 变量:

int roll = dice.Next(1, 7);

在某些情况下,你可能希望直接使用返回值,而无需将其分配给变量。 例如,你可能希望按如下所示将返回值打印到控制台:

Console.WriteLine(dice.Next(1, 7));

即使方法返回了值,也可以在不使用返回值的情况下调用该方法。 例如,可以通过调用该方法来忽略返回值,如下所示:

dice.Next(1, 7);

但是,忽略返回值是毫无意义的。 调用 Next() 方法的原因是便于检索下一个随机值。

调用语句中的方法参数和自变量

调用某个方法时,可以传入该方法将用于完成其任务的值。 这些值称为参数。 方法使用自变量将值赋给方法签名中定义的“参数”。 一种方法可能需要一个或多个参数来完成其任务,或者完全不需要任何参数。

注意

通常,术语“形参”和“实参”可互换使用。 但是,“形参”是指方法内使用的变量。 “实参”是调用方法时传递的值。

大多数方法旨在接受一个或多个参数。 参数可用于配置方法执行其工作的方式,或者,可直接对参数执行操作。 例如,Random.Next() 方法使用参数来配置返回值的上限和下限。 但是,Console.WriteLine() 通过将值输出到控制台,直接使用参数。

方法使用“方法签名”来定义该方法将接受的参数数量以及每个参数的数据类型。 调用该方法的编码语句必须符合方法签名指定的要求。 一些方法提供了适用于该方法所接受参数的数量和类型的选项。

调用方调用该方法时,它为每个参数提供了称为自变量的具体值。 参数必须与参数类型兼容。 但如果在调用代码中使用了自变量名称,则参数名称不必与方法中定义的参数名称相同。

考虑下列代码:

Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);

第一个代码行会创建名为 diceRandom 类的实例。 第二个代码行使用 dice.Next(1, 7) 该方法将随机值分配给一个名为 roll 的整数。 请注意,调用语句提供了两个由 , 符号分隔的参数。 方法 Next() 包括接受两个类型为 int 的参数的方法签名。 这些参数用于为返回的随机数配置下限和上限。 最后一个代码行使用 Console.WriteLine() 方法将 roll 的值打印到控制台。

传递给方法的自变量必须与该方法定义的相应参数的数据类型相同。 如果尝试将错误类型化的参数传递给方法,C# 编译器将会捕获错误,并强制更新调用语句,然后代码才会编译并运行。 类型检查是 C# 和 .NET 用于防止最终用户在运行时遇到错误的一种方式。

注意

尽管会经常使用参数,但并非所有方法都需要参数才能完成其任务。 例如,Console 类包含不使用参数的 Console.Clear() 方法。 由于此方法用于清除控制台中显示的所有信息,因此它不需要参数即可完成它的任务。

重载的方法

.NET 类库中的许多方法都有重载的方法签名。 除此之外,进行类型检查后,无论是否使用调用语句中指定的参数,都能够调用该方法。

"重载方法"是通过多个方法签名定义的。 重载方法提供不同的方式调用方法,或提供不同类型的数据。

在某些情况下,方法的重载版本可用于使用不同的数据类型来定义参数。 例如,Console.WriteLine() 方法具有 19 个不同的重载版本。 其中大多数重载都允许方法接受不同的类型,然后将指定信息写入控制台。 请考虑以下代码:

int number = 7;
string text = "seven";

Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);

在此示例中,将调用 WriteLine() 方法的三个单独的重载版本。

  • 第一个 WriteLine() 方法使用可定义 int 参数的方法签名。
  • 第二个 WriteLine() 方法使用可定义零个参数的方法签名。
  • 第三个 WriteLine() 方法使用可定义 string 参数的方法签名。

在其他情况下,方法的重载版本可定义不同数量的参数。 替代参数可用于更好地控制所需结果。 例如,使用方法 Random.Next() 的重载版本,能够针对随机生成的数字设置各种级别的约束。

以下练习调用了 Random.Next() 方法来生成具有不同级别约束的随机整数值:

  1. 确保在 Visual Studio Code 中打开了一个空的 Program.cs 文件。

    如有必要,请打开 Visual Studio Code,然后完成以下步骤,以在编辑器中准备 Program.cs 文件:

    1. 在“文件”菜单中,选择“打开文件夹”

    2. 使用“打开文件夹”对话框导航到 CsharpProjects 文件夹,然后打开。

    3. 在 Visual Studio Code 的“资源管理器”窗格中,选择“Program.cs”。

    4. 在 Visual Studio Code 的“选择”菜单上,选择“全选”,然后按 Delete 键。

  2. 若要查看 Random.Next() 方法的重载版本,请输入以下代码:

    Random dice = new Random();
    int roll1 = dice.Next();
    int roll2 = dice.Next(101);
    int roll3 = dice.Next(50, 101);
    
    Console.WriteLine($"First roll: {roll1}");
    Console.WriteLine($"Second roll: {roll2}");
    Console.WriteLine($"Third roll: {roll3}");
    
    
  3. 在 Visual Studio Code 的“文件”菜单上,单击“保存”。

  4. 在“资源管理器”面板中,若要在 TestProject 文件夹位置打开终端,请右键单击“TestProject”,然后选择“在集成终端中打开”。

    确保命令提示符中显示的文件夹路径指向包含 Program.cs 文件的文件夹。

  5. 在终端命令提示符处,若要运行代码,请键入 dotnet run,然后按 Enter。

    请注意,结果与以下输出类似:

    First roll: 342585470
    Second roll: 43
    Third roll: 89
    

    生成的数字是随机的,因此结果会有所不同。 但是,此示例展示了你可能会看到的结果范围。

  6. 花点时间检查代码。

    Next() 方法的第一个版本不设置上下限,因此该方法将返回介于 02,147,483,647 之间的值,后者是 int 可存储的最大值。

    Next() 方法的第二个版本将最大值指定为上限,因此在这种情况下,你会得到介于 0100 之间的随机值。

    Next() 方法的第三个版本同时指定最小值和最大值,因此在这种情况下,你会得到介于 50100 之间的随机值。

  7. 关闭“终端”面板。

你已了解本单元中的多个主题。 下面是你已了解的内容的快速列表:

  • 你已了解(当方法提供返回值时)如何使用方法的返回值。
  • 你已了解方法如何使用定义为特定数据类型的参数。
  • 你已了解包含不同参数或参数类型的某些方法的重载版本。

使用 IntelliSense

Visual Studio Code 包括由语言服务提供支持的 IntelliSense 功能。 例如,C# 语言服务根据语言语义和源代码分析提供智能代码补全。 在本部分中,你将使用 IntelliSense 来帮助实现 Random.Next() 方法。

由于 IntelliSense 在代码编辑器中公开,因此无需离开编码环境即可了解有关方法的很多信息。 当你输入代码时,IntelliSense 在光标位置下的弹出窗口中提供提示和参考信息。 当你键入代码时,IntelliSense 弹出窗口会根据上下文更改其内容。

例如,缓慢输入字词 dice 时,IntelliSense 会显示所有 C# 关键字、标识符(或者是代码中的变量名称),以及 .NET 类库中与输入的字母匹配的类。 代码编辑器的自动完成功能可用于键入 IntelliSense 弹出窗口中最匹配的字词。 试用。

  1. 确保 Program.cs 文件在 Visual Studio Code 中处于打开状态。

    应用应包含以下代码:

    Random dice = new Random();
    int roll1 = dice.Next();
    int roll2 = dice.Next(101);
    int roll3 = dice.Next(50, 101);
    
    Console.WriteLine($"First roll: {roll1}");
    Console.WriteLine($"Second roll: {roll2}");
    Console.WriteLine($"Third roll: {roll3}");
    
    
  2. 在代码文件底部,若要试用 IntelliSense,请依次缓慢输入字母 dic

  3. 请注意,当你开始键入时,会显示 IntelliSense 弹出窗口。

    当弹出 IntelliSense 窗口时,应显示建议列表。 输入 dic 后,标识符 dice 应位于列表顶部。

  4. 按键盘上的 Tab 键。

    请注意,完整的字词 dice 是在编辑器中补全的。 在按 Tab 键之前,可使用向上键和向下键更改选择。

    注意

    如果 IntelliSense 窗口消失,可以使用键盘上的 backspace 键选择该窗口,或重新输入上一个符号以重新打开 IntelliSense。

  5. 若要指定成员访问运算符,请输入一个 . 字符。

    请注意,当你输入 . 时,IntelliSense 弹出窗口再次出现,并显示所有可用方法(以及类的其他成员)的未经筛选的列表。

  6. 输入 N

    会筛选此列表,且字词 Next 应为优先选项。

  7. 若要自动补全整个字词,请按 Tab 键。

  8. 若要指定方法调用运算符,请输入 (

    请注意,会自动添加右括号。

    方法调用运算符是位于方法名称右侧的一对括号。 调用语句的这一部分是指定要传递给该方法的参数的位置。 调用方法时,需要方法调用运算符。

  9. 请注意,IntelliSense 弹出窗口现在显示有关 Random.Next() 方法的详细信息。

  10. 请花一点时间查看 Random.Next() 方法的 IntelliSense 弹出窗口。

    注意

    如果 IntelliSense 弹出窗口在你还没来得及查看之前就关闭了,请删除调用运算符 (),然后输入“(”以显示 IntelliSense 弹出窗口。

    请注意,弹出窗口包含三个部分,其中一个部分位于左侧,另外两个部分位于右侧。

    在右侧,你应该会看到顶部的 int Random.Next(int minValue, int maxValue) 和底部的 Returns a non-negative random integer.int 可定义方法的返回类型。 换言之,执行此版本的方法时,会返回 int 类型的值。

    在 IntelliSense 弹出窗口的左侧,会显示 1/3

    1/3 指示你正在查看 Next() 方法的三个方法签名中的第一个。 请注意,使用该方法签名的此版本将会导致该方法无法使用任何参数(未向调用语句中的方法传递任何自变量)。

    请注意,在 1/3 上方和下方还有一个小箭头。

  11. 若要查看方法的第二个重载版本,请按键盘上的向下键。

    请注意,可以使用向上键和向下键在不同的重载版本之间切换。 执行此操作时,IntelliSense 弹出窗口的左侧会显示 1/32/33/3,右侧会显示有用的说明。

  12. 请花一点时间查看 Random.Next() 方法的每个重载版本。

    方法的第二个重载版本 2/3 告知你 Next() 方法可以接受参数 int maxValue。 此说明告知你,maxValue 是你希望 Next() 方法生成的数字的独占上限。 “独占”指示返回数字将小于 maxValue。 因此,当你指定 dice.Next(1,7); 时,最大骰子点数将为 6。 请注意,本部分底部的消息已更新为:Returns a non-negative random integer that is less than the specified maximum.

    该方法的第三个版本 3/3 告知你 Next() 方法可以接受 int minValueint maxValue 作为参数。 新参数 minValue 是你希望 Next() 方法生成的数字的下限。 由于下限是非独占的而不是独占的,因此返回值可以等于 minValue。 底部消息现在显示为:Returns a random integer that is within a specified range.

    在这种情况下,IntelliSense 提供选择适当重载所需的所有信息,包括 maxValueminValue 的详细说明。 但你可能会遇到需要查阅方法文档的情况。

有关重载方法的信息,请使用 learn.microsoft.com

要了解方法的重载版本,第二种方法是参考方法的文档。 通过文档,还可确切了解每个参数的用途。

  1. 首先,请打开首选的 Web 浏览器和搜索引擎。

  2. 搜索 C# Random.Next()

    搜索内容应包括类名和方法名称。 可能还需要包括术语 C#,以确保不会意外获取其他编程语言的结果。

  3. 选择 URL 以 https://learn.microsoft.com 开头的顶部搜索结果。

    其中一个搜索结果应将你指向以 https://learn.microsoft.com 开头的 URL。 在这种情况下,链接的标题应显示为 Random.Next Method

    如果在使用搜索引擎进行查找时遇到问题,请参阅以下链接:

    Random.Next 方法

  4. 打开 C# Random.Next() 的链接

  5. 快速浏览文档。

    向下滚动页面内容以查看各种代码示例。 请注意,可以在浏览器窗口中运行示例。

    learn.microsoft.com 文档遵循 .NET 类库中的每个类和方法的标准格式。

  6. 在网页顶部附近,找到标记为“重载”的部分

    请注意,列出了方法的三个重载版本。 列出的每个重载版本都包含指向页面下方位置的超链接。

  7. 若要在“页面上”导航到第二个重载版本的说明,请选择“Next(Int32)”

    方法的每个版本的相关文档包括:

    • 有关方法功能的简短说明
    • 方法的定义
    • 方法接受的参数
    • 返回值
    • 可能引发的异常
    • 方法使用示例
    • 有关方法的其他注解
  8. 请花一点时间查看“参数”部分

    在“参数”一节中,可以了解到 maxValue 参数是“要生成的随机数的独占上限”。“独占上限”表示,如果需要不大于 10 的数字,则必须传入值 11

    还可通过下一行了解到:“maxValue 必须大于或等于 0”。如果忽略此语句,会发生什么情况? 可在“异常”部分看到,maxValue 小于 0 时,方法将返回 ArgumentOutOfRangeException

    注意

    learn.microsoft.com 中的内容是 .NET 类库的“真实来源”。 请务必花时间阅读文档,了解给定方法的工作原理。

概括

  • 方法可能不接受任何参数,也可能接收多个参数,具体取决于方法的设计和实现方式。 传入多个参数时,使用 , 符号将其分隔开。
  • 方法在完成其任务后可能返回值,也可能不会返回任何内容 (void)。
  • 重载方法支持方法的多个实现,每个实现都具有唯一的方法签名(参数的数目和每个参数的数据类型)。
  • IntelliSense 有助于更快地编写代码。 它提供对方法、其返回值、其重载版本及其参数类型的快速参考。
  • 要了解方法在 .NET 类库中的工作原理,请通过 learn.microsoft.com 这一“可信事实来源”。

知识检查

1.

什么是返回值?

2.

什么是方法参数?

3.

什么是重载方法?

4.

IntelliSense 如何为开发人员提供帮助?