[你必须知道的.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。
其典型用法为:
object o = new object();2

3
class A4

5
{6

7
}8

9
if (o is A) //执行第一次类型兼容检查10

11
{12

13
A a = (A) o; //执行第二次类型兼容检查14

15
}16

17

as的规则如下:
- 检查对象类型的兼容性,并返回结果,如果不兼容就返回null;
- 不会抛出异常;
- 如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。
其典型用法为:
object o = new object();2

3
class B4

5
{6

7
}8

9
B b = o as B; //执行一次类型兼容检查10

11
if (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”的阐述中,规则总结的比较清楚,但主要是用法,并没有在效率上说明,略为遗憾。


浙公网安备 33010602011771号