Is 和 As 之惑

前言

    之前看过Anytao的《你必须知道的.NET》,其中有一章专门介绍Is 和 As 之惑的文章,当时感觉比较简单,就过去了。然而由上一篇博文《选取页面全部TextBox,并赋值的两种方法——从服务器端和JS实现》中再次用到了 Is 关键字(见下代码),然而却感觉印象模糊,所以在此复习之。

protected void Button1_Click(object sender, EventArgs e)
    {
        
//选取form1中的全部控件,为简略,这里不能实现递归,只是实现单层选取
        foreach (Control ct in this.FindControl ("form1").Controls )
        {
            
if (ct is TextBox )
                ((TextBox)ct).Text 
= string.Empty;
        }
        
    }


    对于它们的用法,印象只停留在之前在项目《员工假勤管理系统中》,为了保存单个用户的信息,采用的Session 存储和 用As 提取的模式。

 

as 和 is 解析:

     as 和is 都是在C#安全类型下的转换形式。其规则如下:

  • is 用于转换时,首先作用为Boolean型判断,然后才能进行转换。这里的is ,同在C++和C#中经常提到的,在继承层次时的 “对象2 对象1”的说法相同; 
  • as 用于转换时,当可以有效转换时,通过一次转换即可。如果无法有效转换,则其为null 值;

注:

    as 只能用于引用类型的转换。同时is 和 as 都不会抛异常(因为它们的特性)。见下例:

// Description: 演示类在继承后,所采用is 和as 的操作

// CopyRight: http://www.cnblogs.com/yangmingming

// Notes: 采用最为简单的类继承关系

namespace IsVSAsDemo
{
    
//Animal基类
    public class Animal
    {
        
private string name;
        
public string Name
        {
            
get { return name; }
            
set { name = value; }
        }
        
public virtual  void ShowAnimal()
        {
            Console.WriteLine(
"I am an animal.");
        }
    }
    
//Animal的派生类
    public class Bird : Animal
    {
        
private string type;
        
public string Type
        {
            
get { return type; }
            
set { type = value; }
        }
        
public override void ShowAnimal()
        {
            Console.WriteLine(
"I am animal and {0}", Type);
        }
    }
    
//主程序
    class Program
    {
        
static void Main(string[] args)
        {
            Bird b 
= new Bird();
            b.Name 
= "niao";
            b.Type 
= "bird";
            Animal animal 
= b;

// is 综合应用;
            
//应用is 1:
            if (animal is Bird)
                Console.WriteLine(
"This animal is Bird");
            
else
                Console.WriteLine(
"This animal is not Bird");

            
//应用is 2:
            if (b is Bird)
                Console.WriteLine(
"bird is Bird");
            
else
                Console.WriteLine(
"bird is not Bird");

            
//应用is 3:
            if (b is Animal)
                Console.WriteLine(
"bird is Animal");
            
else
                Console.WriteLine(
"bird is not Animal");

//as 的综合应用
            
// as 的应用1:
            Bird acceptBird = animal as Bird;
            acceptBird.ShowAnimal();

            
// as 的应用2 :
            Animal a = new Animal();
            Bird acceptBird2 
= a as Bird;
            
if (acceptBird2 == null)
                Console.WriteLine(
"We cannot accept Bird By as operator!");//当无法有效转换时,仍为null;
        }
    }
}


 调试结果为:

 

 

由调试结果可对is 和as 的转换方式及结果进行了代码验证。

 

  综述之,由上对is 和 as 的相关分析,以期进一步厘清is 和 as 这两种较常用的转换运算符的了解和学习。在以后的应用中,有所知道。呵呵~  

 

 

 

posted @ 2010-03-16 12:24  Youngman  阅读(426)  评论(0编辑  收藏  举报