【C#语法】C#中强转和as、is的区别
来源:互联网 发布:js继承面试题详解 编辑:程序博客网 时间:2024/06/05 16:59
C#是一门强类型语言,一般情况下最好避免将一个类型转换成另一个类型,但是有些时候又不得不进行类型转换。
C#中有三种类型转换(不考虑.Net提供的Parse),如下:
1、使用as操作符转换
2、使用传统c风格的强制转换
3、使用is先做一个转换测试,然后再使用as操作符或者强转。
一、as和强转之间的区别:
1、as转换类型失败时不会抛出异常;
强转类型失败时会抛出异常。
看下面的例子:
使用as把它强转成string类型:
使用强转把它转换成string类型:
C#中有三种类型转换(不考虑.Net提供的Parse),如下:
1、使用as操作符转换
2、使用传统c风格的强制转换
3、使用is先做一个转换测试,然后再使用as操作符或者强转。
一、as和强转之间的区别:
1、as转换类型失败时不会抛出异常;
强转类型失败时会抛出异常。
看下面的例子:
首先定义一个object类型的变量obj,
object obj = new object();
使用as把它强转成string类型:
string str = obj as string;if (str == null){ Console.WriteLine("转换失败!");}else{ Console.WriteLine("转换成功!");}发现,在若使用as进行转换,则会打印“转换失败”;
使用强转把它转换成string类型:
try { string str = (string)obj; if (str == null) { Console.WriteLine("转换失败!"); } else { Console.WriteLine("转换成功!"); } } catch (System.Exception ex) { Console.Write(ex.Message); }
此时,使用强转会直接抛出异常,捕获异常信息,在屏幕上打印:
无法将类型为“System.Object”的对象强制转换为类型“System.String”
2、处理用户自定义转换不同
首先我们看下下面的转换是否能转换成功:
public class logger { } public class Foo { } /// <summary> /// 定义隐式类型转换 /// </summary> public class Foo1 : Foo { private logger _value; public static implicit operator logger(Foo1 foo1) { return foo1._value; } } static void Main(string[] args) { object foo = new Foo1(); try { logger myfoo1 = (logger)foo; Console.WriteLine("Convert success"); } catch (System.Exception ex) { Console.WriteLine("Convert fail"); } }
答案是转换失败,原因是在程序编译阶段,我们自定义的隐式转换就会被处理,在运行时无效。上述代码中,程序在编译时先会找从foo转换成logger的方法,而我们定义的是从foo1到logger的隐式转换,显然不合适。然后程序生成相应的代码,在运行时进行转换,而此时我们自定义的类型转换在运行时是无效的,程序也就找不到运行时类型转换的方法,也就报出异常。我们要想转换成功,可进行如下的修改:
<pre name="code" class="csharp">static void Main(string[] args) { object foo = new Foo1(); try { Foo1 foo1 = foo as Foo1; logger myfoo1 = (logger)foo1; Console.WriteLine("Convert success"); } catch (System.Exception ex) { Console.WriteLine("Convert fail"); } }先利用as将foo转换成fool1,然后再利用我们定义的隐式转换完成转换。3、as不能利用值类型,因为值类型不能为null,只能利用引用类型
object foo = new Foo1();int i = foo as int;//编译失败为了解决这一问题,我们引入is先对变量进行检验:
<span style="white-space:pre"></span> int i = 0; object foo = new Foo1(); if (foo is int) { i = (int)foo; } logger log = null; if (foo is logger) { log = foo as logger; }
0 0
- 【C#语法】C#中强转和as、is的区别
- c# is和as的区别
- c# is和as的区别
- c# is和as的区别
- C#中is 和 as 的区别
- c# is和as的区别
- c# is和as的区别
- c# is和as的区别
- c# as is 的区别
- C# Is AS 的区别
- C#的?is 和as
- is 和 as 运算符的作用与区别 c#
- c# 中is和as关键字的区别
- c# 中 is 和 as 关键字的区别
- c# 中 is 和 as 关键字的区别
- C#开发中is和as的区别
- c#之is和as的区别用法
- C# as 和 is
- Android JSONArray.remove ()报错
- Onethink 系统架构 开发规划图
- Noip2007普及组
- android Binder 学习
- hdoj 4268 Alice and Bob 【贪心 + set】
- 【C#语法】C#中强转和as、is的区别
- c++静态链接库和动态链接库的创建和调用
- ssh整合简单总结
- csuoj-1722-Race
- 1.2.位、字节、半字、字、内存位宽
- 使用 jquery.validate.messages_cn.js 插件实现表单自动验证,出现中文乱码
- 大数据学习笔记·互联网搜索中的大数据
- B2C商城订单系统UML建模
- java与C++语法上的差别