is只判断类型不转换,as尝试转换失败返回null;二者组合使用会导致重复类型检查,C# 7+推荐用模式匹配if(obj is string s)一次性完成判断与赋值。
is 用于运行时检查对象是否属于某个类型(或其派生类型),返回 true 或 false,**不会执行任何类型转换**。它不抛异常,也不改变原变量值。
常见错误是以为 is 后能直接用转型结果:
if (obj is string) {
Console.WriteLine(obj.Length); // 编译错误!obj 还是 object 类型
}正确写法必须显式转换(或用模式匹配):
if (obj is string) { string s = (string)obj; ... }
if (obj is string s) { Console.WriteLine(s.Length); } —— 这里 s 是新声明的局部变量,不是 obj 被“改类型”了as 尝试将对象引用转换为指定引用类型或可空类型。**仅适用于引用类型和可空值类型**;对非可空值类型(如 int、DateTime)使用会编译报错。
它不抛异常,转换失败时返回 null(对可空值类型返回 null 值)。但要注意:如果目标类型是 string、object 等引用类型,源为 null 时也返回 null,无法区分“本来就是 null”和“转换失败”。
var s = obj as string;(obj 是 object)var i = obj as int; → 编译错误,int 是非可空值类型var i = obj as int?;
这是性能和可读性上最常被忽略的问题。下面这段代码效率低且冗余:
if (obj is string) {
string s = obj as string; // 又做了一次运行时类型检查
Process(s);
}CLR 在 is 和 as 中都会执行相同的类型判定逻辑,相当于重复工作。C# 7+ 的模式匹配语法正是为解决这个而生:
if (obj is string s) Process(s); —— 一次检查,一次赋值as + 空检查:string
s = obj as string; if (s != null) Process(s);
is 后紧跟 as,除非你明确需要中间的布尔判断逻辑对值类型(如 int、Guid、自定义 struct),as 不能用,编译器直接拒绝。但 is 可以配合装箱/拆箱判断:
object obj = 42;
if (obj is int) { /* true */ }
// var x = obj as int; // 编译错误若要安全获取值类型,只能用 is + 显式拆箱,或用泛型方法(如 Convert.ChangeType);注意拆箱必须类型完全一致,obj is int 成立不代表 (int)obj 一定成功(比如 obj 是 long 装箱的 42,is int 为 false,但有人误以为可以强转)。
真正容易被忽略的是:is 对值类型的判断本质是“是否为该类型装箱后的对象”,它不支持隐式转换检查(比如 long 到 int),这点和 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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。