.NET的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操作符在执行效率上更胜一筹,我们在实际的编程中应该体会其异同,酌情量才。

时间: 2024-08-01 18:59:40

.NET的is和as操作符的相关文章

php重载数组操作符

在php中提供了许多接口用于实现一些很特定的功能,比如你想把一个对象当作array使用时,只需要实现ArrayAccess接口,当你想要foreach中能够使用一个对象时,只需要实现Iterator接口,下面给一个例子出来 class BtstoreRoot { /** * 根结点 * @var BtstoreElement */ static $root; } class BtstoreElement implements ArrayAccess, Iterator { /** * 当前所代表

c++ 重载操作符友元问题

问题描述 c++ 重载操作符友元问题 <c++ primer>里面有一段文字: Salesitem 类也是说明为何有些操作符需要设置为友元的一个好例子.它定义了一个成员操作符,并且有三个非成员操作符.这些非成员操作符需要访问私有数据成员,声明为友元: class Sales_item {friend std::istream& operator>>(std::istream& Sales_item&);friend std::ostream& ope

IN操作符与LIKE子句:各种查询

一.指定范围的判断:IN操作符 IN操作符表示的是指定一个查询的范围,例如,现在有如下一个查询要求: 范例:查询出雇员编号是7369.7566.7799的雇员信息 如果按照最早的做法,使用OR操作完成: SELECT * FROM emp WHERE empno=7369 OR empno=7566 OR empno=7799; 如果现在使用了新的操作符IN的话,则代码简单了: SELECT * FROM emp WHERE empno IN (7369,7566,7799); 而如果现在使用的

Swift中的as操作符

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! Swift中的as!操作符简单的去展开一个optional. 如果你试图完成一个不匹配的转换(意味着两种类型不可以做实际的转换),你将得到一个trap. 这里有两种类型转换

c编译-c语言sizeof操作符的问题

问题描述 c语言sizeof操作符的问题 sizeof后面加函数名为什么结果会是1,求大神详细讲解原因,不要说不能加,因为编译运行出来了结果啊,总有原因的 解决方案 http://segmentfault.com/q/1010000000801175/a-1020000000925625 gcc的规定 解决方案二: 把你的代码贴出来,是不是你用错了. 解决方案三: 原因都是说对void和函数名的sizeof操作是没有意义的.但是我想知道为什么会有结果,并且结果还都是1啊,这有什么能解释的么?对v

js操作符类型转换大全(前端面试题之操作符)

 操作符运算符,在前端的面试题目中经常出现,很多朋友在对其运算的时候经常出错.说明对操作符运算还没有完全理解,我前面的一篇文章,javascript双等号引起的类型转换,主要讲解双等号引起的类型转换.本篇文章可以说是对这篇文章的补充吧!   首先,我们先来做一些题目吧!为了统一,我不混着来写这些题目,面试题目中,经常将这些题目混起来,这样对你的迷惑度会更大,为了更方便演示,我在这里分模块写了一些题目,大家可以看下!   //操作符字符串的隐性转换   //乘法   console.dir("--

Javascript实例代码讲解instanceof操作符

文章简介:在JavaScript中,我们可以用instanceof操作符来判断对象是否是某个类的实例,如果obj instaceof Class返回true,那么我们认为obj是Class的实例,obj要么由Class创建,要么由Class的子类创建. 在JavaScript中,我们可以用instanceof操作符来判断对象是否是某个类的实例,如果obj instaceof Class返回true,那么我们认为obj是Class的实例,obj要么由Class创建,要么由Class的子类创建.来自

javascript typeof 操作符

typeof 操作符 typeof 操作符(和 instanceof 一起)或许是 JavaScript 中最大的设计缺陷, 因为几乎不可能从它们那里得到想要的结果. 尽管 instanceof 还有一些极少数的应用场景,typeof 只有一个实际的应用(译者注:这个实际应用是用来检测一个对象是否已经定义或者是否已经赋值), 而这个应用却不是用来检查对象的类型.     注意: 由于 typeof 也可以像函数的语法被调用,比如 typeof(obj),但这并是一个函数调用.     那两个小括

JavaScript instanceof 操作符

JavaScript instanceof 操作符 instanceof 操作符用来比较两个操作数的构造函数.只有在比较自定义的对象时才有意义. 如果用来比较内置类型,将会和 typeof 操作符 一样用处不大. 比较自定义对象 function Foo() {} function Bar() {} Bar.prototype = new Foo(); new Bar() instanceof Bar; // true new Bar() instanceof Foo; // true // 如

JavaScript操作符instanceof揭秘

在JavaScript中,我们可以用instanceof操作符来判断对象是否是某个类的实例,如果obj instaceof Class返回true,那么我们认为obj是Class的实例,obj要么由Class创建,要么由Class的子类创建.来自Java或其他强类型语言的开发者一定认为如果obj instaceof Class返回true,那么obj肯定拥有Class的所有属性.事实是这样么?我们看下面的代码:(斑头雁原创:http://bantouyan.iteye.com) Js代码 fun