一、is运算符用于判断一个对象是否可以转换为指定的类型,不会抛出异常,返回bool值用来表示是否转换成功:
if (myObj is MyClass) { //do... }
当满足以下任意一种情况时转换成功:
1.转换对象是目标类型的实例;
2.转换对象是派生自目标类型的类型的实例;
3.转换对象是实现目标接口的类型的实例;
在C#7.0以上版本中支持is模式匹配表达式和switch模式匹配表达式;
二、as运算符与强制转换类似,但不会抛出异常,如果转换不成功,会返回null,通常搭配判空操作一起使用:
MyClass myObj = obj as MyClass; if (myObj != null) { //do... }
1.as运算符仅可以用于目标类型为引用类型或可空类型的类型转换操作,在转换时一般不会创建新的对象(如果原对象为值类型且目标类型为引用类型,转换成功时则会产生装箱操作,产生新对象);对于目标类型为非可空类型的值类型,可以使用is运算符配合强制转换进行转换:
if (myObj is int) { int myNum = (int)myObj; //do... }
※在泛型中,如果需要使用as运算符将对象转换为类型参数的类型,需要添加基类约束或类类型的约束:
where T : BaseClass //指定基类约束 where T : class //指定类类型约束
2.is和as运算符都不会执行自定义的类型转换(此时应该使用强制转换),它们仅当被转换对象的运行时类型符合目标类型转换规则时(即上面的几种情况)才能转换成功;
※较于强制转换,应该尽可能的使用as运算符,因为使用as运算符进行转换更加安全,也更加高效;
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!
作者:Minotauros
出处:https://www.cnblogs.com/minotauros/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签:
原文地址:https://www.cnblogs.com/minotauros/p/11614106.html