zoukankan      html  css  js  c++  java
  • C# is和as操作符

    C# is和as操作符

    来源 https://www.cnblogs.com/gsk99/p/4991483.html

    is和as操作符

    is操作符:检查对象是否与给定类型兼容。

    说明:

    1、如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true,否则返回false。

    (1):表达式为空:返回false

    //表达式为空
    object oo = null;
    bool isstudent3 = oo is student;

    (2):表达式内容不为空,但强制转换类型时发生异常,返回false

    oo = new object();
    bool isstudent4 = oo is student;

    (3):表达式为null时,并不会抛异常,因为没有正确的对象来做类型验证。

    2、is操作符只考虑引用转换、装箱转换和取消装箱转换。下面的程序都会发生编译时错误(CTE):已知表达式将始终是 true 或始终是 false

    int i=5;
    if (i is decimal )
    {
      //提示:给定表达式始终不是所提供的("decimal")类型
    }
    if (i is int)
    {
      //给定表达式始终为所提供的("int")类型
    }

    3、不能重载is操作符。

    4、"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式。

    if ((delegate(int i) { return i; }) is testdelegate)
    {
      //提示:"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式
    }
    if (((x) => { return x; }) is testdelegate)
    {
      //提示:"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式
    }


    as 运算符:用于在兼容的引用类型之间执行转换
    说明:

    1、as操作符类似于强制转换,但又有区别,当对象为null时,不会抛异常而是会返回null。

    object _object = null;
    student _s = _object as student;

    object as student其实相当于_object is student?(student)_object:null;

    之所以这样说,我们可以从两者的IL代码中看出些结论:首先我们实例化个基类对象。

    object o = new student();

    然后分别执行:

    (1) o is student,对应IL代码

    .method private hidebysig static void Main(string[] args) cil managed
    {
      .entrypoint
      // 代码大小 18 (0x12)
      .maxstack 2
      .locals init ([0] object o,
      [1] bool isstudent2)
      IL_0000: nop
      IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
      IL_0006: stloc.0
      IL_0007: ldloc.0
      IL_0008: isinst JmTest.ConsoleApplication1.student
      IL_000d: ldnull
      IL_000e: cgt.un
      IL_0010: stloc.1
      IL_0011: ret
    } // end of method Program::Main

    (2) o as student,对应IL代码

    .method private hidebysig static void Main(string[] args) cil managed
    {
      .entrypoint
      // 代码大小 15 (0xf)
      .maxstack 1
      .locals init ([0] object o,
      [1] class JmTest.ConsoleApplication1.student s2)
      IL_0000: nop
      IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
      IL_0006: stloc.0
      IL_0007: ldloc.0
      IL_0008: isinst JmTest.ConsoleApplication1.student
      IL_000d: stloc.1
      IL_000e: ret
    } // end of method Program::Main

    小结:两段IL代码都执行了isinst,它代表的意思是:测试对象引用是否为特定类的实例,在as操作符后面有一个stloc.1它代表的意思是:从计算堆栈的顶部弹出当前值到索引1处的局部变量列表中。从这两条IL语句的用途可以说明is和as操作符的部分关系。


    2、as 运算符只执行引用转换和装箱转换,无法执行其他转换。下面的代码是错误的:

    object _object = null;
    student _s = _object as student;
    //试图将一个对象转换成委托
    testdelegate test = _s as testdelegate;

    ============== End

  • 相关阅读:
    JS在ff和ie区别(未完,待续...)
    得出一年中已过的天数
    div高度随浏览器变化
    offsetTop,offsetLeft
    完美的DIV三行三列自适应高度布局
    YUI Compressor
    Android repo 出现error.GitError: manifests revlist ('^12303f87b9f90c07bf4aec4c4353ba514ee70c8a', 'HEAD', ''): fatal: bad revision 'HEAD'
    1、ECharts(中国地图篇)的使用
    2012年新浪微博用户密码泄露漏洞(图片解析)
    铁道部购票网站可能造成另一次的密码危机(转)
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/10366890.html
Copyright © 2011-2022 走看看