zoukankan      html  css  js  c++  java
  • as和is,但is也有as所没有的功能[C#] --转载 甘木

    在C#中,我们可以使用is as操作符来判断某数据类型和其它指定类型的关系

    1. 用is运算符验证基础类型

    C#允许在继承链中向下转型,所以如果DerivedClass派生自BaseClass,那么DerivedClass a; a is BaseClass返回true

    2. 用as而不是强制转换

    as运算符在某些情况下能代替强制转换操作,我们推荐使用as而不是以前的强制转换,因为普通的强制转换如果失败,会抛出一个需要处理的异常;但是as转换如果失败,仅是把转换结果变为null,而不是抛出一个异常。

    3. as是is的语法糖

    下面两段代码是一个效果

    1Foo f = x as Foo;
    2
    3var temp = x;
    4Foo f = (temp is Foo) ? (Foo)temp : (Foo)null;

    具体参见Eric大大的blog

    http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx

    4. as 不是万能转换器

    例如:用户自定义转换

     1ClassA{
    2
    3publicstaticexplicitoperator ClassB (ClassA a){
    4
    5returnnew ClassB();
    6
    7}
    8
    9}
    10
    11ClassA a=new ClassA();
    12
    13ClassB b;
    14
    15b=(ClassA)a;//正确。通过自定义转换
    16
    17b=a as ClassB;//返回null。is判断就不会通过

     as运算符只执行引用转换和装箱转换。

    as运算符无法执行其他转换,如用户定义的转换,这类转换应使用case表达式来代替其执行。

    虽说as是is的语法糖,但是is能够用于不可为空类型判断,而as就不能。

    "a as int;"这样的代码会错误,除非是“a as int?;”,“ a is int”这样的代码就是没问题的

    int a=3;
    Console.WriteLine ( a isint );//正常判断,输出true
    int? b = a asint?;//正常转换
    int c = a asint;//报错:as不能用于不能为null的类型转换

    5. 总结

    1. as是is的语法糖,即as是否能正确转换,内部还是靠is的验证的。

    1.1. 虽说是语法糖,但是is能作用于不可为空类型(例如:值类型),as不能作用于此类型

    2. as比强制转换能好,毕竟转换失败它不会抛出异常。

    3. as不是万能的,例如强制转换能够处理“用户自定义转换”,而as就不行了。

    6. 鸣谢

    语法糖理论:@刀 刀,@地狱门神,@坎普利特

    as不能作用于不能为空的类型转换,而is就可以:@Zhenway

    提出编码错误:@pandaren,@_冻结_

    实践出真知:@Snokye

    及各位耐心阅读并提出意见的朋友 :)

    还有其它不正确的地方请多多指教 !

  • 相关阅读:
    校验相关问题
    类型转换和操作符重载 (c#)
    泛型委托Func<string,string>()
    第三次作业 刘惠惠
    刘惠惠1.12
    第二次作业刘惠惠2.6,2.15
    刘惠惠1.8
    第四次作业 刘惠惠
    刘惠惠1.2
    设计模式中的单件模式
  • 原文地址:https://www.cnblogs.com/allen0/p/5111434.html
Copyright © 2011-2022 走看看