C# 中 Is 和 As 运算符关键字的区别

2025年3月17日 | 阅读 10 分钟

当不需要类型转换,并且唯一任务是验证对象的类型时,**“is”** 运算符非常有效。另一方面,当您必须验证对象的类型并在其不是提供的类型时将其转换为其他类型时,**“as”** 运算符非常有效。在本文中,您将了解 C# 中 **Is** 和 **As** 运算符关键字之间的区别。但在讨论它们的区别之前,您需要了解 C# 中的 Is 和 As 运算符关键字。

什么是 'is' 运算符?

**“is”** 运算符用于在 C# 中完成 **类型检查**。它确定对象是否属于给定类型或从给定类型派生的类型。类型检查的输出由“is”运算符返回的布尔值(true 或 false)表示。

语法

它具有以下语法:

**expression:** 将在指定的类型上进行测试。

**is:** “is” 是一个运算符关键字。

**type:** 您要检查的类型。

类型检查的方法

有几种类型检查方法。一些主要的类型检查方法如下:

1. 基本类型检查

在 C# 中,**基本类型检查** 涉及使用 is 运算符检查对象是否为特定类型或从该类型派生。此功能使开发人员能够在运行时确定对象的类型并做出适当的响应。

示例

让我们举一个例子来说明 C# 中 **基本类型检查** 的使用。

输出

O is a string.

说明

  1. **'O'** 被分配了一个已构造的字符串类型的对象。
  2. 如果对象 **'O'** 是字符串类型,则使用 **is** 运算符进行验证。
  3. 由于 **'O'** 确实是一个字符串,因此条件为 true。
  4. 之后,程序将 **“O is a string.”** 打印到控制台。

2. 检查接口实现

在 C# 中,您可以使用 **“is”** 运算符检查对象是否实现了特定接口。当您希望在对象遵循特定接口时执行某些操作时,这是一个有用的功能。

示例

让我们举一个例子来说明 C# 中的 **接口实现**。

输出

O implements Animal.

说明

  1. 我们构造一个 Animal 类型的对象并将其分配给 **'O'**。
  2. 运算符验证对象 **'O'** 是否属于 Animal 类型或从 Animal 派生的类型。
  3. 由于 **Dog** 实现了 **Animal** 接口,因此条件成立。
  4. 之后,程序将 **“O implements Animal.”** 打印到控制台。

3. 检查派生类型

检查派生类型是通过使用 C# 中的 **is** 运算符确定的,无论对象是给定类型还是继承层次结构中从它派生的任何类型。当您希望根据类型之间的关系执行某些操作时,这一点尤其正确。

示例

输出

O is an Parent.

说明

  1. **'O'** 接收了 **Child** 类型的对象的赋值。
  2. **is** 运算符确定对象 'O' 是否属于 Parent 类型或从 Parent 派生的类型。
  3. 条件成立,因为 'O' 是 Child 类型,而 Child 类型派生自 Parent。
  4. 之后,程序将 **“O is a Parent.”** 打印到控制台。

5. 使用模式匹配

在 C# 中,使用 **is** 运算符进行 **模式匹配** 可以在确定对象的类型并从中提取数据时启用更具表达性和简洁性的代码。它旨在使类型转换和类型检查更容易理解且不易出错。

示例

输出

O is a string that can be parsed as an int.

说明

  1. 如果 **'O'** 是一个字符串,则使用 **is** 运算符进行验证。
  2. 如果是,则将转换为字符串值的 **'O'** 设置为模式变量 str_ing。
  3. 之后,检查 **TryParse** 条件。如果过程成功,则打印有关解析为整数的消息;否则,打印不同的消息。

什么是 'as' 运算符?

**“as”** 运算符根据提供的表达式是否可以转换为给定类型返回布尔结果(true 或 false)。它经常用于条件语句或表达式中,以根据对象的类型执行不同的操作。

**“as”** 运算符用于转换 **兼容的引用** 或 **可空类型**。此运算符在对象与指定类型兼容时返回对象,如果转换不成功则返回 null,而不是抛出异常。**as** 运算符的工作方式与“is”运算符非常相似,但方式更简洁。

在使用显式类型转换时,“as”运算符用于将对象转换为特定类型或从该类型派生的类型。如果转换成功,结果是转换后的对象;否则,结果是 null。

语法

它具有以下语法:

**expression:** 表达式是您想要进行转换的对象。

**as:** **'as'** 是一个运算符关键字。

**type:** 您希望将表达式应用于的类型称为 type。

1. 检查派生类型

**“as”** 运算符用于在 C# 中完成类型转换引用类型。如果转换成功,您可以尝试使用“as”运算符通过将对象转换为特定类型并获取对象的引用来检查派生类型。如果转换失败,结果为 null。

示例

让我们举一个例子来检查 C# 中的 **派生类型**。

输出

Oops!!

说明

  1. 在此示例中,我们构造一个 **Child** 类型的对象并将其分配给 **'O'**。
  2. 运算符尝试将 **'O'** 转换为 Child 类型。
  3. 条件语句确定转换是否成功。
  4. 如果成功,它会调用 Child 类的 Display() 方法。
  5. 如果失败,它会打印一条消息,指示该对象不是 Child 类型。
  6. 此程序将输出 **“Oops!!,”**,表示转换成功并且调用了 Child 类的 **Display()** 方法。

2. 处理数组

在将数组从基类型转换为派生类型时,您可以使用 **“as”** 运算符。它通常用于类型转换引用类型。但是,重要的是要记住,**“as”** 运算符仅适用于引用类型和可空类型,不能用于其他类型。

示例

输出

The string found is: Joe

说明

  1. 在此示例中,**foreach** 循环迭代 **HetroArray** 中的每个元素。
  2. 之后,**as** 运算符尝试将每个元素转换为字符串。
  3. 如果成功,则运行“Console.WriteLine”命令,将元素作为字符串处理。
  4. 如果失败,则跳过该元素。
  5. 此程序的输出将是:
  6. 找到的字符串是:Joe
  7. 输出证实运算符正确地将数组的第一个成员(字符串)转换为字符串类型,并且程序相应地打印了一条消息。

3. 检查接口实现

在 C# 中进行类型转换引用类型时,**“as”** 运算符可用于验证接口实现。当“as”运算符成功将对象转换为给定类型时,它会生成该类型的对象;否则,它会返回“null”。当对象实现接口时,接口实现的检查结果是对对象的非空引用;否则,结果为 **“null”**。

示例

输出

Helloo...

说明

  1. 在此示例中,**'O'** 被分配了一个已创建的 Animal 类型的对象。
  2. 之后,运算符尝试将 **'O'** 转换为 Dog 类型。
  3. 条件语句确定转换是否成功。
  4. 如果成功,它会调用 Dog 接口的 Display() 方法。
  5. 如果失败,它会打印一条消息,说明该对象未实现 **Dog**。
  6. 此程序的输出将是:
  7. 你好...
  8. 如本输出所示,调用了 Dog 接口的 **Display()** 方法,并且 as 运算符成功地将 Animal 对象转换为 Dog 接口。

4. 基本类型转换

**“as”** 运算符在 C# 中经常用于基本类型转换,尤其是类型转换引用类型。当“as”运算符成功将对象转换为给定类型时,它会生成该类型的对象;否则,它会返回“null”。重要的是要记住,as 运算符只能用于可空值类型和引用类型。

示例

输出

Casting successful: Hii, Joe!!
  1. 在此示例中,**'O'** 被分配了一个已构造的字符串类型的对象。
  2. 之后,通过 as 运算符尝试将 **'O'** 转换为字符串类型。
  3. 条件语句确定转换是否成功。
  4. 如果成功,则将转换后的字符串打印到控制台。
  5. 如果失败,它会打印一条消息,说明转换失败。
  6. 输出:此程序的输出将是:
  7. 转换成功:Hii, Joe!!
  8. 此输出证实该对象已使用“as”运算符正确转换为字符串,并且程序打印了转换后的字符串。

注意:请务必记住,“if”语句可以使用 IS 运算符,“try-catch”语句可以使用 As 运算符。

C# 中 Is 和 As 运算符关键字的主要区别

Difference between Is and As operator keyword in C#

C# 中的 Is 和 As 运算符之间有几个区别。Is 和 As 运算符之间的一些主要区别如下:

类别is 运算符as 运算符
目的类型检查类型检查
语法表达式是类型表达式作为类型
结果返回 false 或 true它返回 null 或指定类型的对象。
行为不进行转换,而是验证兼容性执行实际转换;如果转换失败,则返回 null。
安全性对值类型和引用类型都安全。对可空值类型安全;也适用于引用类型。
异常处理没有异常风险不引发异常;如果失败,则返回 null。
用途用于条件语句中的类型检查。用于管理潜在故障和安全类型转换。
典型场景在进行类型特定操作之前检查对象的类型。将对象转换为特定类型而不会出现异常。
  1. **“as”** 运算符仅限于引用类型。它不能与浮点型或整型等值类型一起使用。
  2. 值类型和引用类型都与 **is** 运算符兼容。
  3. 由于 **“as”** 运算符只需执行一次转换,因此它比 **“is”** 运算符更高效。
  4. 由于我们可以在比 **“as”** 运算符更广泛的情况下使用 **“is”** 运算符,因此它更灵活。
  5. **“as”** 运算符返回一个有效的转换或 null,而 IS 运算符返回一个布尔值。这是两个运算符之间的主要区别。换句话说,is 运算符检查对象的类型,而 as 运算符检查其可转换性。

AS 优于 IS 运算符的优点

尽管每个运算符都有其应用,但在某些情况下 AS 运算符优于 IS 运算符。

  1. 当使用 as 运算符而不是显式转换运算符时,代码更易于理解和简洁。
  2. 通过使用 **as** 运算符,可以安全地执行转换,而不会出现显式转换运算符可能导致的运行时错误风险。
  3. 如果转换无效,**as** 运算符允许返回 null 值,从而避免了额外的错误处理代码。

结论

总之,C# 开发人员的工具离不开 **is** 和 **as** 运算符。尽管它们具有某些共同点,但某些区别也使它们在各种情况下都很有用。as 运算符提供了一种安全的转换方法,而 is 运算符则有助于类型验证。