在上一单元中,我们使用掷骰子代码说明了两种不同方法:有状态(实例)方法和无状态(静态)方法。 但是,同一代码示例可帮助我们了解有关调用方法的其他关键概念,例如处理返回值、接受输入参数和选择方法的重载版本。
返回值
一些方法旨在完成其功能并“安静地”结束。 换言之,它们在完成时不返回值。 这些方法称为 void 方法。
旨在完成后返回值的方法通常是某个操作的结果。 返回值是方法与调用方法的代码进行通信的主要方式。
方法可设计为返回任何数据类型,甚至是另一个类。 在本示例中,Random.Next()
方法返回随机生成的数字的 int
值。 我们将返回值保存到变量中,以便稍后在代码中使用。 我们可能已忽略返回值,如下所示:
dice.Next(1, 7);
但这种做法毫无意义。 调用此方法的理由是调用后即可检索 Random 对象的下一个随机值。
输入参数
一些方法旨在接受无输入参数。 这些方法无需额外输入即可完成其任务。
其他方法旨在接受一个或多个输入参数。 输入参数可配置方法执行其工作的方式。 或者,可直接操作输入参数。 我们可通过示例来了解这两种情况。
调用方法时,使用 ,
符号分隔每个输入参数。
在下面的代码行中,在 Next()
方法生成新的随机数字时,两个输入参数分别为该方法定义了下限和上限。
int roll = dice.Next(1, 7);
在下面的代码行中,WriteLine()
对输入参数进行操作,使其显示在控制台中。
Console.WriteLine(roll);
使用数据类型定义输入参数。 不能将不同数据类型的值作为输入参数传递,并要求方法正常工作。 相反,C# 编译器将捕获错误,并在编译和运行代码之前强制进行代码修改。 类型检查是 C# 和 .NET 用户检查数据类型来防止最终用户遇到异常的一种方法。
方法签名是为每个输入参数定义的输入参数的数目和数据类型。
重载的方法
.NET 类库中的许多方法都有重载的方法签名。
重载方法是通过多个方法签名定义的。 重载方法提供不同的方式调用方法,或提供不同类型的数据。
在某些情况下,可通过给定方法的重载版本,将不同数据类型的值发送到方法中。 例如,Console.WriteLine()
方法具有 19 个不同的重载版本。 其中的大多数重载都允许将不同类型的打印数据发送到控制台。 请考虑以下代码
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
在此示例中,将调用 WriteLine()
方法的三个单独的重载版本。
在其他情况下,给定方法的重载版本允许向方法发送其他有关所需结果的配置详细信息。 例如,Random.Next()
方法具有三个不同的重载版本。 这三个版本允许对随机生成的数字设置约束。
下面的代码示例使用三个不同的重载版本调用 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}");
Next()
方法的第一个版本不设置上下限,因此该方法将返回介于 0
到 2,147,483,647
之间的值,后者是 int
可存储的最大值。
Next()
方法的第二个版本将最大值指定为上限,因此在这种情况下,我们会得到介于 0
到 100
之间的随机值。
Next()
方法的第三个版本同时指定最小值和最大值,因此在这种情况下,我们会得到介于 50
到 100
之间的随机值。
本文介绍了以下内容:
- 方法可实现的操作
- 它是否具有重载版本
- 它接受哪些数据类型作为输入参数
- 它是否有返回值;如果有,它返回哪些内容。
使用 IntelliSense
首先,代码编辑器的 Intellisense 可在不离开编码环境的情况下告知有关方法的很多信息。 Intellisense 是 Microsoft 为代码编辑器提供的一项功能。 输入代码时,在插入点下的弹出窗口中提供提示和简短的参考信息。 键入代码时,Intellisense 弹出窗口会根据上下文更改其内容。
例如,缓慢输入字词 dice
时,Intellisense 显示所有 C# 关键字、标识符(或者是代码中的变量名称),以及 .NET 类库中与输入的字母匹配的类。 代码编辑器的自动完成功能用于键入 Intellisense 弹出窗口中最匹配的字词。
若要体验 Intellisense,请依次输入字母 d
、i
、c
。 Intellisense 弹出时,应显示 dice
标识符。 在键盘上选择 tab
键,即可完成整个字词。 也可使用向上键和向下键更改选择。
备注
如果 Intellisense 窗口消失,可以使用键盘上的
backspace
键选择该窗口,或重新输入上一个符号以重新打开 Intellisense。
接下来,输入成员访问运算符。 Intellisense 弹出窗口再次出现,并显示所有可用的方法(以及类的其他成员)。 如果输入字母 N
,则筛选此列表,且字词 Next
应为优先选项。 同样,在键盘上选择 tab
键,即可自动完成整个字词。
接下来,输入左括号。 会自动添加右括号。
更重要的是,Intellisense 弹出窗口中会显示两个区域。 在右侧,应看到 int Random.Next()
。 int
为返回类型。 换言之,执行此版本的方法时,会返回 int
类型的值。
在 Intellisense 弹出窗口的左侧,显示 1/3
,指示现在显示的是 Next()
方法的第一个版本,该版本不接受输入参数。 在 1/3
上方和下方还有一个小箭头。 选择键盘的向上键和向下键,即可导航到该方法的第二个和第三个重载版本。 执行此操作时,2/3
和 3/3
会分别显示在 Intellisense 的左侧。
方法的第二个重载版本 2/3
告知你 Next()
方法可以接受输入参数 int maxValue
。 该方法的第三个版本 3/3
告知你 Next()
方法可以接受 int minValue
和 int maxValue
作为输入参数。
什么是 maxValue
和 minValue
? 通常,可通过参数名称得出参数含义。 但是,如果其含义不明显,我们可能需要查阅方法的文档。 在这种情况下,maxValue
是最大值,或 Next()
方法生成数字的“上限”。 minValue
是最小值,或 Next()
方法生成数字的“下限”。
有关重载方法的信息,请使用 docs.microsoft.com
要了解方法的重载版本,第二种方法是参考方法的文档。 通过文档,还可确切了解每个输入参数的用途。
首先,使用搜索引擎,并搜索类名称和方法名称。 可能还要包括术语 C#
,确保不会意外地得到其他编程语言的结果。 在这种情况下,请尝试搜索:C# Random.Next()
。
其中一个搜索结果应将你指向以 https://docs.microsoft.com
开头的 URL。 在我们的示例中,链接的标题应显示为“Random.Next 方法(系统)| Microsoft Docs”。
文档遵循 .NET 类库中的每个类和方法的标准格式。
在网页顶部附近,可看到名为“重载”的部分。 此处列出了该方法的三个版本,并提供了链接到具体页面的超链接。 选择文本 Next(Int32)
,并找到有关方法的特定重载版本的文档。
方法的每个版本都显示以下内容:
- 有关方法功能的简短说明
- 方法的定义
- 方法接受的输入参数
- 返回值
- 可能引发的异常
- 方法使用示例
- 有关方法的其他注解
在“参数”一节中,我们了解到 maxValue
输入参数是“要生成的随机数的独占上限”。“独占上限”表示,如果需要不大于 10
的数字,则必须传入 11
值。
我们还可通过下一行了解到:“maxValue
必须大于或等于 0”。如果忽略此句,会发生什么情况? 在“异常”一节中可发现,maxValue
小于 0 时,方法将返回 ArgumentOutOfRangeException
。
如前所述,docs.microsoft.com 是 .NET 类库的真实来源。 请务必花时间阅读文档,了解给定方法的工作原理。
回顾
- 方法可能不接受任何参数,也可能接收多个参数,具体取决于方法的设计和实现方式。 传入多个输入参数时,使用
,
符号将其分隔开。 - 方法在完成其任务后可能返回值,也可能不会返回任何内容 (void)。
- 重载方法支持方法的多个实现,每个实现都具有唯一的方法签名(输入参数的数目和每个输入参数的数据类型)。
- Intellisense 有助于更快地编写代码。 它提供对方法、其返回值、其重载版本及其输入参数类型的快速参考。
- 若要了解 .NET 类库中方法的工作原理,请通过 docs.microsoft.com 获取“事实来源”。