• 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. asis的语法糖

    下面两段代码是一个效果

    1 Foo f = x as Foo;
    2
    3 var temp = x;
    4 Foo 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 不是万能转换器

    例如:用户自定义转换

     1 ClassA{
    2
    3 public static explicit operator ClassB (ClassA a){
    4
    5 return new ClassB();
    6
    7 }
    8
    9 }
    10
    11 ClassA a=new ClassA();
    12
    13 ClassB b;
    14
    15 b=(ClassA)a;//正确。通过自定义转换
    16
    17 b=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
    is int );//正常判断,输出true
    int? b = a as int?;//正常转换
    int c = a as int;//报错:as不能用于不能为null的类型转换

      

    5. 总结

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

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

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

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

    6. 鸣谢

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

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

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

    实践出真知:@ Snokye

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

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

  • 相关阅读:
    SQLServer之创建AFETER DELETE触发器
    SQLServer之创建DML AFTER UPDATE触发器
    SQLServer之创建DML AFTER INSERT触发器
    css制作环形进度条
    curl教程2
    windows下更改鼠标滚轮方向
    curl tutorial with examples of usage
    为npm设置代理
    日期类型的input元素设置默认值为当天
    加盐密码哈希:如何正确使用
  • 原文地址:https://www.cnblogs.com/ganmuren/p/2121974.html
Copyright © 2020-2023  润新知