C# as 和 is 运算符区别和用法

news/2025/1/30 10:50:29 标签: c#, 开发语言, .net, 微软技术, .net core

前言

在C#中,as 和 is 关键字都用于处理类型转换的运算符,但它们有不同的用途和行为。本文我们将详细解释这两个运算符的区别和用法。

is 运算符

is 运算符用于检查对象是否是某个特定类型,或者是否可以转换为该类型。它返回一个布尔值 (true 或 false)。

            string title = "Hello DotNetGuide";

            if (title is string)
            {
                Console.WriteLine("是 string 类型");
            }
            else
            {
                Console.WriteLine("不是 string 类型");
            }

            if (title is not null)
            {
                Console.WriteLine("不为 null");
            }
            else
            {
                Console.WriteLine("为 null");
            }

模式匹配

C# 7.0 引入了模式匹配,允许在 is 表达式中进行类型检查和转换:

            object obj = "追逐时光者";

            if (obj is string str)
            {
                Console.WriteLine($" {str}");
            }
            else
            {
                Console.WriteLine("不是指定类型");
            }

列表模式

从 C# 11 开始,可以使用列表模式来匹配列表或数组的元素。以下代码检查数组中处于预期位置的整数值:

int[] empty = [];
int[] one = [1];
int[] odd = [1, 3, 5];
int[] even = [2, 4, 6];
int[] fib = [1, 1, 2, 3, 5];

Console.WriteLine(odd is [1, _, 2, ..]);   // false
Console.WriteLine(fib is [1, _, 2, ..]);   // true
Console.WriteLine(fib is [_, 1, 2, 3, ..]);     // true
Console.WriteLine(fib is [.., 1, 2, 3, _ ]);     // true
Console.WriteLine(even is [2, _, 6]);     // true
Console.WriteLine(even is [2, .., 6]);    // true
Console.WriteLine(odd is [.., 3, 5]); // true
Console.WriteLine(even is [.., 3, 5]); // false
Console.WriteLine(fib is [.., 3, 5]); // true

as 运算符

as 运算符尝试将对象转换为特定类型,如果转换失败,则返回 null 而不是抛出异常。它通常用于在不需要显式检查对象是否为特定类型的情况下进行安全的类型转换。

注意:as 运算符仅考虑引用、可以为 null、装箱和取消装箱转换。它不支持用户定义的或复杂的类型转换,这种情况需要使用强制转换表达式。

            object title = "Hello DotNetGuide";

            string str = title as string;
            if (str != null)
            {
                Console.WriteLine("是 string 类型: " + str);
            }
            else
            {
                Console.WriteLine("不是 string 类型");
            }

            int? num = title as int?;
            if (num.HasValue)
            {
                Console.WriteLine("是 int 类型: " + num.Value);
            }
            else
            {
                Console.WriteLine("不是 int 类型");
            }

C#/.NET/.NET Core面试宝典

本文已收录至C#/.NET/.NET Core面试宝典中,欢迎关注获取更多面试干货内容。

参考文章

  • https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/is

  • https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/type-testing-and-cast#as-operator


http://www.niftyadmin.cn/n/5837762.html

相关文章

大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)

大数据相关职位介绍之一 随着大数据、人工智能(AI)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…

深入 Rollup:从入门到精通(一)专栏介绍

专栏介绍 欢迎来到 《深入 Rollup:从入门到精通》 专栏!🎉 本专栏将带您全面掌握 Rollup 这一强大的 JavaScript 模块打包工具。 无论您是初学者还是有一定经验的开发者,都能在这里找到适合自己的学习路径。 通过本专栏&#…

Vue3 结合 .NetCore WebApi 前后端分离跨域请求简易实例

1、本地安装Vue3环境 参考:VUE3中文文档-快速上手 注意:初始安装vue时,需要安装router,否则后续也要安装 2、安装axios组件 比如:npm install axioslatest 或 pnpm install axioslatest 3、设置跨域请求代理 打开…

BGP分解实验·15——路由阻尼(抑制/衰减)实验

一个可以监控路由信息不稳定征兆的小特性,那些表现出不稳定的路由将会受到惩罚,直到它稳定下来为止。 实验拓扑如下: 配置两台路由器的基础连通性后,再到R2上设置半衰期5分钟、使用阈值750,惩罚阈值1500;并…

git push到远程仓库时无法推送大文件

一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…

【Linux】gdb——Linux调试器

gdb使用背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 gdb使用方法 首先进入gdb gdb test_glist显示代码 断点 b 行…

第十章 E - F 开头的术语

文章目录 第十章 E - F 开头的术语字节序 (endian)企业缓存协议 (Enterprise Cache Protocol, ECP)枚举属性 (enumerated attribute)独占锁 (exclusive lock)显式引用 (explicit reference)表达式方法 (expression method)扩展全局引用 (extended global reference)范围索引 (e…

LabVIEW无线齿轮监测系统

本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…