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

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

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

  • 相关阅读:
    爆打团队 2016.04.12 站立会议
    爆打团队 2016.04.11 站立会议
    爆打团队 2016.04.10 站立会议
    爆打小组 4.3日站立会议
    随机生成题目的代码分析
    爆打 第二周第二次站立会议(2016.3.29)
    爆打小组,四则运算,算法实现
    add some template for ec-final
    2014_acmicpc_shanghai_google
    matrix_world_final_2013
  • 原文地址:https://www.cnblogs.com/allen0/p/5111434.html
Copyright © 2011-2022 走看看