is 用于判断对象是否为指定类型并返回布尔值,as 用于安全转换类型并返回转换结果或 null;二者不抛异常、不强制转型,适合类型不确定时使用,常配合空值检查或模式匹配。

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 Listlist && list.Count > 0)
什么时候不该用它们?
is 和 as 不适用于值类型直接转换(比如把 object 转 int),此时需用 Convert.ToInt32() 或 (int)(object)(后者可能抛 InvalidCastException)。
- 值类型转换建议优先用
TryParse或Convert类方法 - 若确定类型一定匹配,且追求性能,可考虑直接强制转换(但风险自担)
-
as对 struct 类型无效,编译报错;想转值类型请用obj as int?再取.Value(注意判空)
基本上就这些。is 看“是不是”,as 试“能不能转”,两者配合能写出更安全、更清晰的类型处理逻辑。







