zoukankan      html  css  js  c++  java
  • As 和 Is的区别

    首先来说说As是干什么的:

    代码:

    void OnMouseEnter(object sender, MouseEventArgs e)
    {
    Ellipse ell = sender as Ellipse; //就它了
    ell.Fill = new SolidColorBrush(Colors.Yellow);
    }
    Ellipse ell = sender as Ellipse;     
    sender是事件源,这句的意思是把引发该事件的事件源转成Ellipse类型as是用来强制类型转换的,用as转换的好处是:转换失败不会出现异常,而是返回NULL,这样就比一般的转换安全

    代码://鼠标离开后恢复默认
            private void OnMouseLeaveSizeLabel(object sender, EventArgs e)
    
            {
    
                Label label = sender as Label;
    在这里使用到了sender传入的事件源(事件源就是当前按钮的属性,是lable,button还是testbox,在这里就是lable),现在这个sender是object类型的,所以要对这个事件源进行转换,如果不操作,如this.close(),就不用转换这个sender
                if (label.Name == minisize.Name)
    
                    minisize.Image = Resources.Min;
    
                else if (label.Name == maxsize.Name)
    
                {
    
                    if (maxstate)
    
                        maxsize.Image = Resources.Restore;
    
                    else
    
                        maxsize.Image = Resources.Max;
    
                }
    
                else if (label.Name == closebutton.Name)
    
                    closebutton.Image = Resources.Close;
    
            }

    再说说IS:
    is就是处于对类型的判断。返回true和false。如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。另外is操作符永远不会抛出异常。
     System.Boolean b1 = (o is System.Object);//b1 为true
    System.Boolean b2 = (o is Employee);//b2为false


    现在说说As和Is的区别:

    摘自CLR via C#第三版第四章

    在c#中is可以用来判断一个对象是否兼容给定的类型,如果是返回true,否则返回false。

    同时is是永不会抛出异常的。如果对象引用是null,is操作符总是返回false。

    Object o = new Object();
    Boolean b1 = (o is Object);  //返回true
    Boolean b1 = (o is Employee); //返回false

    一般is操作符的使用方式如下

    //先进行判断
    if( o is Employee){
        Employee e = (Employee) o;
       .....
    }

    在该过程中CLR实际会检查两次对象类型,首先is操作符检查o是否兼容Employee,如果是在if内部

    CLR会再次核实o是否引用一个Employee。这会对性能造成一定影响。这是因为CLR首先必须判断o引用的

    对象实际的类型,然后遍历继承层次结构,用每个基类型去核对。

    C#提供了as操作符来简化这种代码的写法,来提高性能。

    Employee e = o as Employee;
    if(e !==null){
    }

    如果o兼容于Employee,as会返回同一个对象的非null引用。如果不兼容,会返回null。as操作符CLR只会校验一次对象的类型。

    同时它也永远不会抛出异常,所以要检查生成的引用是否为null。





  • 相关阅读:
    喵哈哈村的魔法考试 Round #19 (Div.2) B 快速加
    hdu5676 ztr loves lucky numbers DFS
    hdu 5950 Recursive sequence 矩阵快速幂
    AI大语音(三)—傅里叶变换家族
    AI大语音(二)——语音预处理
    AI大语音(一)——语音识别基础
    第二章:声学模型之EM算法
    量子力学2
    量子力学1
    C#学习系列(一)——C#和C++的区别
  • 原文地址:https://www.cnblogs.com/jingsheng99/p/3992470.html
Copyright © 2011-2022 走看看