c# is 和 as 操作符的区别


is只判断类型不转换,as尝试转换失败返回null;二者组合使用会导致重复类型检查,C# 7+推荐用模式匹配if(obj is string s)一次性完成判断与赋值。

is 操作符只判断类型,不转换

is 用于运行时检查对象是否属于某个类型(或其派生类型),返回 truefalse,**不会执行任何类型转换**。它不抛异常,也不改变原变量值。

常见错误是以为 is 后能直接用转型结果:

if (obj is string) {
    Console.WriteLine(obj.Length); // 编译错误!obj 还是 object 类型
}

正确写法必须显式转换(或用模式匹配):

  • 老写法:if (obj is string) { string s = (string)obj; ... }
  • C# 7+ 推荐:if (obj is string s) { Console.WriteLine(s.Length); } —— 这里 s 是新声明的局部变量,不是 obj 被“改类型”了

as 操作符尝试转换,失败返回 null

as 尝试将对象引用转换为指定引用类型或可空类型。**仅适用于引用类型和可空值类型**;对非可空值类型(如 intDateTime)使用会编译报错。

它不抛异常,转换失败时返回 null(对可空值类型返回 null 值)。但要注意:如果目标类型是 stringobject 等引用类型,源为 null 时也返回 null,无法区分“本来就是 null”和“转换失败”。

  • 合法:var s = obj as string;objobject
  • 非法:var i = obj as int; → 编译错误,int 是非可空值类型
  • 合法(可空):var i = obj as int?;

is 和 as 组合使用容易引发两次类型检查

这是性能和可读性上最常被忽略的问题。下面这段代码效率低且冗余:

if (obj is string) {
    string s = obj as string; // 又做了一次运行时类型检查
    Process(s);
}

CLR 在 isas 中都会执行相同的类型判定逻辑,相当于重复工作。C# 7+ 的模式匹配语法正是为解决这个而生:

  • ✅ 推荐:if (obj is string s) Process(s); —— 一次检查,一次赋值
  • ✅ 或者直接用 as + 空检查:string s = obj as string; if (s != null) Process(s);
  • ❌ 避免 is 后紧跟 as,除非你明确需要中间的布尔判断逻辑

值类型场景下 as 完全不可用,is 仍可用

对值类型(如 intGuid、自定义 struct),as 不能用,编译器直接拒绝。但 is 可以配合装箱/拆箱判断:

object obj = 42;
if (obj is int) { /* true */ }
// var x = obj as int; // 编译错误

若要安全获取值类型,只能用 is + 显式拆箱,或用泛型方法(如 Convert.ChangeType);注意拆箱必须类型完全一致,obj is int 成立不代表 (int)obj 一定成功(比如 objlong 装箱的 42,is intfalse,但有人误以为可以强转)。

真正容易被忽略的是:is 对值类型的判断本质是“是否为该类型装箱后的对象”,它不支持隐式转换检查(比如 longint),这点和 as 的适用范围限制一起,让值类型的安全转换始终比引用类型更繁琐。


# 区别  # c#  # 编译错误  # 隐式转换  # String  # Object  # NULL  # if  # 派生类型  # 局部变量  # int  # 值类型  # 引用类型  # 空类型  # Length  # Struct  # 泛型  # var  # 类型转换  # console  # 对象  # 它不  # 或用  # 的是  # 这是  # 也不  # 两次  # 适用于  # 不代表  # 这段  # 布尔 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: PHP怎么接收前端传的时间戳_处理时间戳参数转换技巧汇总【指南】  Win11怎么设置开机密码_Windows11账户登录选项PIN码  如何使用Golang log记录不同级别日志_Golang log Println与Fatal示例  Windows服务启动类型恢复方法_错误修改导致的系统服务异常  C++中引用和指针有什么区别?(代码说明)  Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录  c# await 一个已经完成的Task会发生什么  Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】  php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】  如何使用Golang编写单元测试_创建Test函数验证业务逻辑  Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】  静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  php删除数据怎么软删除_添加is_del字段标记删除【技巧】  Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】  Go 中 defer 语句在 goroutine 内部不返回时不会执行  如何在 Go 中高效缓存与分发网络视频流  如何在Golang中写入JSON文件_保存结构体数据到文件  Windows 11如何查看系统激活密钥_Windows 11使用CMD或PowerShell命令找回Product Key  php修改数据怎么改富文本_update更新html内容注意事项【说明】  如何在 Go 中正确反序列化多个同级 XML 元素(而非单个根节点)  Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作  Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】  Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】  Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】  如何在Golang中定义接口_抽象方法和多态实现  Win11怎么关闭OneDrive同步_Win11取消自动备份文件【教程】  Win11怎么更改计算机名_Windows11系统信息重命名设备教程  php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】  MySQL 中使用 IF 和 CASE 实现查询字段的条件转换  php485函数执行慢怎么优化_php485性能提升小技巧【技巧】  Linux怎么查找死循环进程_Linux系统负载分析与进程彻底结束【教程】  如何在Golang中捕获JSON序列化错误_Golangjson.Marshal错误处理示例  Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁  Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询  Win10如何备份注册表_Win10注册表备份步骤【攻略】  Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】  如何在Golang中修改数组元素_通过指针实现原地更新  Python高性能计算项目教程_NumPyCythonGPU并行加速  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】  如何在 Windows 11 中使用 AlomWare 工具箱  Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】  mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】  php高频调试功能有哪些_php常用调试函数与工具汇总【解答】  c++如何使用std::bind绑定函数参数_c++ 占位符std::placeholders使用【详解】  PHP怎么接收URL中的锚点参数_获取#后面参数值的技巧【详解】  如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法 

 2026-01-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.