练习 - 方法的返回值和参数
在上一单元中,你使用“掷骰子”编码方案说明了有状态(实例)和无状态(静态)方法之间的区别。 这种相同的方案可以帮助你了解有关调用方法的其他重要概念。 例如:
- 处理方法的返回值。
- 方法参数以及将自变量传递给方法。
- 选择方法的重载版本。
返回值
一些方法旨在完成其功能并“安静地”结束。 换言之,它们在完成时不返回值。 这些方法称为 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);
第一个代码行会创建名为 dice
的 Random
类的实例。 第二个代码行使用 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()
方法来生成具有不同级别约束的随机整数值:
确保在 Visual Studio Code 中打开了一个空的 Program.cs 文件。
如有必要,请打开 Visual Studio Code,然后完成以下步骤,以在编辑器中准备 Program.cs 文件:
在“文件”菜单中,选择“打开文件夹”。
使用“打开文件夹”对话框导航到 CsharpProjects 文件夹,然后打开。
在 Visual Studio Code 的“资源管理器”窗格中,选择“Program.cs”。
在 Visual Studio Code 的“选择”菜单上,选择“全选”,然后按 Delete 键。
若要查看
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}");
在 Visual Studio Code 的“文件”菜单上,单击“保存”。
在“资源管理器”面板中,若要在 TestProject 文件夹位置打开终端,请右键单击“TestProject”,然后选择“在集成终端中打开”。
确保命令提示符中显示的文件夹路径指向包含 Program.cs 文件的文件夹。
在终端命令提示符处,若要运行代码,请键入 dotnet run,然后按 Enter。
请注意,结果与以下输出类似:
First roll: 342585470 Second roll: 43 Third roll: 89
生成的数字是随机的,因此结果会有所不同。 但是,此示例展示了你可能会看到的结果范围。
花点时间检查代码。
Next()
方法的第一个版本不设置上下限,因此该方法将返回介于0
到2,147,483,647
之间的值,后者是int
可存储的最大值。Next()
方法的第二个版本将最大值指定为上限,因此在这种情况下,你会得到介于0
到100
之间的随机值。Next()
方法的第三个版本同时指定最小值和最大值,因此在这种情况下,你会得到介于50
到100
之间的随机值。关闭“终端”面板。
你已了解本单元中的多个主题。 下面是你已了解的内容的快速列表:
- 你已了解(当方法提供返回值时)如何使用方法的返回值。
- 你已了解方法如何使用定义为特定数据类型的参数。
- 你已了解包含不同参数或参数类型的某些方法的重载版本。
使用 IntelliSense
Visual Studio Code 包括由语言服务提供支持的 IntelliSense 功能。 例如,C# 语言服务根据语言语义和源代码分析提供智能代码补全。 在本部分中,你将使用 IntelliSense 来帮助实现 Random.Next()
方法。
由于 IntelliSense 在代码编辑器中公开,因此无需离开编码环境即可了解有关方法的很多信息。 当你输入代码时,IntelliSense 在光标位置下的弹出窗口中提供提示和参考信息。 当你键入代码时,IntelliSense 弹出窗口会根据上下文更改其内容。
例如,缓慢输入字词 dice
时,IntelliSense 会显示所有 C# 关键字、标识符(或者是代码中的变量名称),以及 .NET 类库中与输入的字母匹配的类。 代码编辑器的自动完成功能可用于键入 IntelliSense 弹出窗口中最匹配的字词。 试用。
确保 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}");
在代码文件底部,若要试用 IntelliSense,请依次缓慢输入字母
d
、i
和c
。请注意,当你开始键入时,会显示 IntelliSense 弹出窗口。
当弹出 IntelliSense 窗口时,应显示建议列表。 输入
dic
后,标识符dice
应位于列表顶部。按键盘上的 Tab 键。
请注意,完整的字词
dice
是在编辑器中补全的。 在按 Tab 键之前,可使用向上键和向下键更改选择。注意
如果 IntelliSense 窗口消失,可以使用键盘上的
backspace
键选择该窗口,或重新输入上一个符号以重新打开 IntelliSense。若要指定成员访问运算符,请输入一个
.
字符。请注意,当你输入
.
时,IntelliSense 弹出窗口再次出现,并显示所有可用方法(以及类的其他成员)的未经筛选的列表。输入 N
会筛选此列表,且字词
Next
应为优先选项。若要自动补全整个字词,请按 Tab 键。
若要指定方法调用运算符,请输入 (
请注意,会自动添加右括号。
方法调用运算符是位于方法名称右侧的一对括号。 调用语句的这一部分是指定要传递给该方法的参数的位置。 调用方法时,需要方法调用运算符。
请注意,IntelliSense 弹出窗口现在显示有关
Random.Next()
方法的详细信息。请花一点时间查看
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
上方和下方还有一个小箭头。若要查看方法的第二个重载版本,请按键盘上的向下键。
请注意,可以使用向上键和向下键在不同的重载版本之间切换。 执行此操作时,IntelliSense 弹出窗口的左侧会显示
1/3
、2/3
和3/3
,右侧会显示有用的说明。请花一点时间查看
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 minValue
和int maxValue
作为参数。 新参数minValue
是你希望Next()
方法生成的数字的下限。 由于下限是非独占的而不是独占的,因此返回值可以等于minValue
。 底部消息现在显示为:Returns a random integer that is within a specified range.
在这种情况下,IntelliSense 提供选择适当重载所需的所有信息,包括
maxValue
和minValue
的详细说明。 但你可能会遇到需要查阅方法文档的情况。
有关重载方法的信息,请使用 learn.microsoft.com
要了解方法的重载版本,第二种方法是参考方法的文档。 通过文档,还可确切了解每个参数的用途。
首先,请打开首选的 Web 浏览器和搜索引擎。
搜索 C# Random.Next()
搜索内容应包括类名和方法名称。 可能还需要包括术语
C#
,以确保不会意外获取其他编程语言的结果。选择 URL 以
https://learn.microsoft.com
开头的顶部搜索结果。其中一个搜索结果应将你指向以
https://learn.microsoft.com
开头的 URL。 在这种情况下,链接的标题应显示为Random.Next Method
。如果在使用搜索引擎进行查找时遇到问题,请参阅以下链接:
打开 C# Random.Next() 的链接。
快速浏览文档。
向下滚动页面内容以查看各种代码示例。 请注意,可以在浏览器窗口中运行示例。
learn.microsoft.com 文档遵循 .NET 类库中的每个类和方法的标准格式。
在网页顶部附近,找到标记为“重载”的部分。
请注意,列出了方法的三个重载版本。 列出的每个重载版本都包含指向页面下方位置的超链接。
若要在“页面上”导航到第二个重载版本的说明,请选择“Next(Int32)”。
方法的每个版本的相关文档包括:
- 有关方法功能的简短说明
- 方法的定义
- 方法接受的参数
- 返回值
- 可能引发的异常
- 方法使用示例
- 有关方法的其他注解
请花一点时间查看“参数”部分。
在“参数”一节中,可以了解到
maxValue
参数是“要生成的随机数的独占上限”。“独占上限”表示,如果需要不大于10
的数字,则必须传入值11
。还可通过下一行了解到:“
maxValue
必须大于或等于 0”。如果忽略此语句,会发生什么情况? 可在“异常”部分看到,maxValue
小于 0 时,方法将返回ArgumentOutOfRangeException
。注意
learn.microsoft.com 中的内容是 .NET 类库的“真实来源”。 请务必花时间阅读文档,了解给定方法的工作原理。
概括
- 方法可能不接受任何参数,也可能接收多个参数,具体取决于方法的设计和实现方式。 传入多个参数时,使用
,
符号将其分隔开。 - 方法在完成其任务后可能返回值,也可能不会返回任何内容 (void)。
- 重载方法支持方法的多个实现,每个实现都具有唯一的方法签名(参数的数目和每个参数的数据类型)。
- IntelliSense 有助于更快地编写代码。 它提供对方法、其返回值、其重载版本及其参数类型的快速参考。
- 要了解方法在 .NET 类库中的工作原理,请通过 learn.microsoft.com 这一“可信事实来源”。