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

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;
            }





  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值