is 和 as 是 C# 中用于类型检查与安全转换的两个关键操作符,它们不抛异常、不强制转型,适合在不确定对象实际类型时使用。
用 is 判断类型是否兼容
is 用于运行时检查对象是否为指定类型(或其派生类型),返回 bool 值。它只做类型兼容性判断,不进行转换。
语法:obj is TypeName—— 返回 true 表示 obj 非 null 且可隐式/显式视为 TypeName 支持泛型类型、可空类型、接口,也支持模式匹配(C# 7+):
obj is string s可同时判断并赋值 注意:
null is SomeType永远为 false(除非 SomeType 是可空引用类型且启用了 nullable 引用类型)
用 as 安全转换类型
as 尝试将对象转换为指定引用类型或可空值类型,成功则返回转换后对象,失败则返回 null(对值类型不适用,会编译错误)。
语法:var result = obj as TypeName;—— 等价于
obj is TypeName ? (TypeName)obj : null,但更简洁高效 仅适用于引用类型、可空值类型(如
int?)、接口;不能用于非可空值类型(如
int、
DateTime) 避免重复类型检查:先
is再强转是冗余写法,推荐直接
as+ null 检查
is 和 as 的典型配合用法
常见场景是「先尝试转换,再使用」,推荐用
as+ 空值检查,或 C# 7+ 的 is 模式匹配写法: 传统方式:
var str = obj as string; if (str != null) { /* 使用 str */ }
模式匹配(更简洁):if (obj is string s) { /* 直接使用 s */ }
还可嵌套类型检查:if (obj is List<int> list && list.Count > 0)</int>
什么时候不该用它们?
is 和 as 不适用于值类型直接转换(比如把
object转
int),此时需用
Convert.ToInt32()或
(int)(object)(后者可能抛
InvalidCastException)。 值类型转换建议优先用
TryParse或
Convert类方法 若确定类型一定匹配,且追求性能,可考虑直接强制转换(但风险自担)
as对 struct 类型无效,编译报错;想转值类型请用
obj as int?再取
.Value(注意判空)
基本上就这些。is 看“是不是”,as 试“能不能转”,两者配合能写出更安全、更清晰的类型处理逻辑。
