[你必须知道的.NET] 第一回:恩怨情仇:is和as

发布日期:2007.4.7 作者:Anytao

©2007 Anytao.com 转贴请注明出处,留此信息。

 

本文将介绍以下内容:

• 类型转换

• is/as操作符小议 

1. 引言 

类型安全是.NET设计之初重点考虑的内容之一,对于程序设计者来说,完全把握系统数据的类型安全,经常是力不从心的问题。现在,这一切已经在微软大牛们的设计框架中为你解决了。在.NET中,一切类型都必须集成自System.Object类型,因此我们可以很容易的获得对象的准确类型,方法是:GetType()方法。那么.NET中的类型转换,应该考虑的地方有那些呢?

2. 概念引入

类型转换包括显示转换和隐式转换,在.NET中类型转换的基本规则如下:

  • 任何类型都可以安全的转换为其基类类型,可以由隐式转换来完成;
  • 任何类型转换为其派生类型时,必须进行显示转换,转换的规则是:(类型名)对象名;
  • 使用GetType可以取得任何对象的精确类型;
  • 基本类型可以使用Covert类实现类型转换;
  • 除了string以外的其他类型都有Parse方法,用于将字符串类型转换为对应的基本类型;
  • 值类型和引用类型的转换机制称为装箱(boxing)和拆箱(unboxing)。

3. 原理与示例说明

浅谈了类型转换的几个普遍关注的方面,该将主要精力放在is、as操作符的恩怨情仇上了。类型转换将是个较大的话题,留于适当的时机讨论。

is/as操作符,是C#中用于类型转换的,提供了对类型兼容性的判断,从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制。

is的规则如下:

  • 检查对象类型的兼容性,并返回结果,true或者false;
  • 不会抛出异常;
  • 如果对象为null,则返回值永远为false。

其典型用法为:

 

 1object o = new object();
 2
 3class A
 4
 5{
 6
 7}

 8
 9if (o is A)  //执行第一次类型兼容检查
10
11{
12
13  A a = (A) o;  //执行第二次类型兼容检查
14
15}

16
17

 

 as的规则如下:

  • 检查对象类型的兼容性,并返回结果,如果不兼容就返回null;
  • 不会抛出异常;
  • 如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。

其典型用法为: 

 

 1object o = new object();
 2
 3class B
 4
 5{
 6
 7}

 8
 9B b = o as B;  //执行一次类型兼容检查
10
11if (b != null)
12
13{  
14
15  MessageBox.Show("b is B's instance.");
16
17}

18
19

 

4. 结论

纵上比较,is/as操作符,提供了更加灵活的类型转型方式,但是as操作符在执行效率上更胜一筹,我们在实际的编程中应该体会其异同,酌情量才。 

参考文献

(USA)Jeffrey Richter, Applied Microsoft .NET Framework Programming

 (USA) Stanley B. Lippman, C# Primer

 

©2007 Anytao.com 转贴请注明出处,留此信息。

-------------------------------------------------------------------------------------------------------------

读书笔记

 

类型安全涉及的知识点比较多,在本文中“概念引入”所总结的基本规则就是指的引用类型,可能是因为基本的值类型在学习任何一门语言中都提到过的。

 

首先一个基本的概念就是任何类型都继承自Object类型,那么可以通过查看在FCl中Object类来知晓所有类型都具有的属性和方法。值得一提的是,OO思想(封装,继承,多态)就是在指引用类型,由此也引出栈,托管堆(或托管模块)都术语和概念。

 

一点感悟,经常提到多态,多态会在以后的学习狠狠的学,但显然这里获得对象的准确类型GetType()方法不会声明为虚方法,因为NET强调半天的类型安全,而如果被开发人员重写了GetType()方法,修改了实际的类型,显然是不能忍受的。

示例:
using System;

class Fruit
{

}
class Apple:Fruit
{

}
class Test
{
    public static void Main(string[] args)
    {
        Fruit f = new Fruit();//ok
       
        Apple a = new Apple();//ok
       
        Fruit b = new Apple();//ok,用is a的关系说,苹果是一个水果
       
       //Apple c = new Fruit();//error,无法将类型"Fruit"隐式转换为"Apple"。存在一个显示转换<是否缺少一个强制转换>
    }
}

文章的作者在这里没有讲类型和对象的概念,,无论在web form 或win form的开发中,都是在比拼你对FCL类库的熟练掌握程度,而开发中,无论是简单的Console.WriteLin(),还是拖拉一个控件,都是考察你是否理顺了类型,对象,继承,之间千丝万缕的关系,你当然可以对这样的语句习以为常,视而不见,例:string  tb_name=this.TextBox1.Text.Tostring(),但你一定是要在知其然知其所以然的情况下,这Text的属性一定是多个界面控件可能用到的,所以去看Control(控件的一个基类)的成为高手的必经之路,同样ToString()方法出现在哪里,一定要追根溯源,你可以在Object基类中找到。

 

从技术上来说,这么少的篇幅没有体现出is和as的恩愿情愁,甚至引起为我对基础知识的一些混淆,但却引起我对什么是类型,什么是对象这一最基础的问题点进行学习。

 

在对于“is,as”的阐述中,规则总结的比较清楚,但主要是用法,并没有在效率上说明,略为遗憾。

 

posted @ 2008-04-23 21:15  Mahon  阅读(175)  评论(0)    收藏  举报