【C#语法】C#中强转和as、is的区别

来源:互联网 发布:js继承面试题详解 编辑:程序博客网 时间:2024/06/05 16:59
C#是一门强类型语言,一般情况下最好避免将一个类型转换成另一个类型,但是有些时候又不得不进行类型转换。
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