Skip to content
On this page

调用 .NET 类库中不同种类的方法

使用 Console.WriteLine() 方法时,从第一批代码开始,我们一直在调用方法。并非所有类和方法的实现方式都相同。

如何调用 .NET 类库中的方法

通过以前调用 Console.WriteLine() 方法的经验,你应已了解基本知识:

  • 首先键入类名称 Console
  • 添加成员访问运算符,即 . 符号。
  • 添加方法的名称 WriteLine
  • 添加方法调用运算符,该运算符是一组括号 ()
  • 最后,在左括号和右括号(如 "Hello World!")之间添加需要 Console.WriteLine() 方法打印为输入参数的值。

(可选)根据开发者设计和实现给定方法的方式,可能还需要执行以下操作:

  • 传递其他值为输入参数。
  • 接受返回值。

我们将在下一单元中介绍输入参数和返回值。

虽然某些方法的调用方式与 Console.WriteLine() 的调用方式相同,但 .NET 类库中还有一些方法需要使用其他调用方式。

调用 .NET 类库中不同种类的方法

下面的示例通过生成随机数字并将其打印到控制台来模拟掷骰子:

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

如果多次运行代码,控制台输出中将显示介于 1 到 6 之间的不同数字。

首先,让我们来逐步介绍每个代码行完成的任务,然后我们会提出一些重要问题,并介绍如何使用 .NET 类库中的类和方法。

第一个代码行创建 .NET 类库中 System.Random 类的新实例,并将对新对象的引用存储在名为 dice 的变量中。

第二个代码行调用 dice 对象的 Next() 方法,传入两个参数:随机数字的最小值和最大值。 Next() 方法返回值,我们将其保存到名为 roll 的变量中。

第三个代码行调用 WriteLine() 方法,将 roll 的值打印到控制台。

在此代码示例中,我们将调用 Random 类和 Console 类的方法。但是,这些方法的调用方式不同。使用不同技术调用这些方法的原因是,有些方法是有状态的,而有些方法是无状态的。

有状态方法与无状态方法

在计算中,“状态”用于描述特定时刻下执行环境的状况。代码逐行执行时,值存储在变量中。在执行过程中的任何时候,应用程序的当前状态为存储在内存中的所有值的集合。

某些方法的正常工作不依赖于应用程序的当前状态。换言之,实现无状态方法是为了在不引用或更改内存中存储的任何值的情况下正常工作。无状态方法也称为静态方法

例如,Console.WriteLine() 方法不依赖于内存中存储的任何值。该方法执行其函数并完成工作,而不会以任何方式影响应用程序的状态。

但是,其他方法必须有权访问应用程序的状态,才能正常工作。换言之,有状态方法是依赖于由以前的已执行代码行存储在内存中的值构建的或者,有状态方法通过更新值或将新值存储在内存中来修改应用程序的状态。它们也称为实例方法。

有状态(实例)方法在字段中跟踪方法的状态,这些字段是在类上定义的变量。对于存储状态的这些字段,类的每个新实例都将获取其自己的副本。

单个类可支持有状态方法和无状态方法。但是,需要调用有状态方法时,必须首先创建类的实例,这样方法才能访问状态。

创建类的实例

类的实例称为对象。若要创建类的新实例,请使用 new 运算符。请考虑下面这一代码行,此代码行可创建 Random 类的新实例,以此创建名为 dice 的新对象:

csharp
Random dice = new Random();

new 运算符执行以下几项重要操作:

  • 首先请求足够大的计算机内存地址,用于存储基于 Random 类的新对象。
  • 创建新的对象,并将其存储在内存地址上。
  • 返回内存地址,使其保存在 dice 变量中。

从此时起,引用 dice 变量时,.NET 运行时在幕后执行查找操作,这会造成一种直接使用对象本身的假象。

为什么 Next() 方法是有状态的?

你可能想知道为什么 Next() 方法以有状态方法实现? .NET 类库设计器无法找出在无需状态的情况下生成随机数字的方法吗?而且 Next() 方法存储或引用的内容究竟是什么?

这些都是合理的问题。在较高的级别上,计算机擅长按照特定指令来创建可靠且可重复的结果。为了创建随机错觉,Next() 方法的开发者决定将日期和时间具体捕获到毫秒的小数部分,并用它来设置一种算法,使其每次都会生成不同数字。虽然并非完全随机,但可满足大多数应用程序。在 dice 对象的生存期内捕获和维护的状态是种子值。后续每次对 Next() 方法的调用都将重新运行该算法,但需确保种子发生更改,这样才不会返回相同的值。

而要使用 Random.Next() 方法,是无需了解其工作原理的。需要注意的一点是,一些方法需要在调用该方法之前创建类的实例,而其他方法则不需要。

如何确定是否需要先创建类的实例,然后再调用其方法?

一种了解方法调用方式的方法是参考文档。可通过其中的一些示例了解是必须从对象实例调用方法,还是必须直接从类调用方法。

备注

文档最有用的部分之一是代码示例,它们展示了如何使用相关方法。有时,需要在页面上向下滚动,才能找到代码示例。

或者,也可以尝试直接从类本身访问该方法。可能出现的最糟糕的情况是遇到编译错误。

如果在 .NET 编辑器中键入以下代码行:

csharp
int result = Random.Next();

将显示一条红色波浪线,指示发生编译错误。将鼠标游标悬停在红色波浪线上,会出现一个弹出窗口,其中显示以下消息:

bash
(1,14): error CS0120: An object reference is required for the non-static field, method, or property 'Random.Next()'

概括

  • 若要调用 .NET 类库中类的方法,请采用 ClassName.MethodName() 格式,其中 . 符号是成员访问运算符,用于访问在类中定义的方法,而 () 符号是方法调用运算符。
  • 调用无状态方法时,无需先创建其类的新实例。
  • 在调用有状态方法时,需要创建类的实例,并访问对象的方法。
  • 使用 new 运算符创建类的新实例。
  • 类的实例称为对象。