C#怎么使用is和as操作符 C#类型转换与检查方法

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

isas 是 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?)、接口;不能用于非可空值类型(如 intDateTime
  • 避免重复类型检查:先 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 list && list.Count > 0)

什么时候不该用它们?

isas 不适用于值类型直接转换(比如把 objectint),此时需用 Convert.ToInt32()(int)(object)(后者可能抛 InvalidCastException)。

  • 值类型转换建议优先用 TryParseConvert 类方法
  • 若确定类型一定匹配,且追求性能,可考虑直接强制转换(但风险自担)
  • as 对 struct 类型无效,编译报错;想转值类型请用 obj as int? 再取 .Value(注意判空)

基本上就这些。is 看“是不是”,as 试“能不能转”,两者配合能写出更安全、更清晰的类型处理逻辑。