首先来说说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。