[你必须知道的.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。

其典型用法为:

 1None.gifobject o = new object();
 2None.gif
 3None.gifclass A
 4None.gif
 5ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 6InBlock.gif
 7ExpandedBlockEnd.gif}

 8None.gif
 9None.gifif (o is A)  //执行第一次类型兼容检查
10None.gif
11ExpandedBlockStart.gifContractedBlock.gifdot.gif{
12InBlock.gif
13InBlock.gif  A a = (A) o;  //执行第二次类型兼容检查
14InBlock.gif
15ExpandedBlockEnd.gif}

16None.gif
17None.gif

 as的规则如下:

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

其典型用法为: 

 1None.gifobject o = new object();
 2None.gif
 3None.gifclass B
 4None.gif
 5ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 6InBlock.gif
 7ExpandedBlockEnd.gif}
 8None.gif
 9None.gifB b = o as B;  //执行一次类型兼容检查
10None.gif
11None.gifif (b != null)
12None.gif
13ExpandedBlockStart.gifContractedBlock.gifdot.gif{  
14InBlock.gif
15InBlock.gif  MessageBox.Show("b is B's instance.");
16InBlock.gif
17ExpandedBlockEnd.gif}

18None.gif
19None.gif

4. 结论

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

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

 (USA) Stanley B. Lippman, C# Primer

 

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

本贴子以现状提供且没有任何担保,同时也没有授予任何权利。
This posting is provided "AS IS" with no warranties, and confers no rights.

转载于:https://www.cnblogs.com/anytao/archive/2007/04/07/must_net_01.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USACO 6.3 章节 你对搜索和剪枝一无所知QAQ

emmm........很久很久以前 把6.2过了 所以emmmmmm 直接跳过 &#xff0c;从6.1到6.3吧 Fence Rails 题目大意 N<50个数A1,A2... 1023个数,每个数数值<128,B 问 A 们能拆分成多少个B,求最多的个数 样例 解释 A: 3030 4018193 501516172 2524 B: 15 (ok) 16 (ok) 17 (ok) 1…

在基于Spring的Web应用程序中使用Http Session

在基于Spring的Web应用程序中拥有和使用Http会话有多种方法。 这是基于最近项目经验的总结。 方法1 只需在需要的HttpSession中注入即可。 Service public class ShoppingCartService {Autowired private HttpSession httpSession;... }尽管令人惊讶&#xff0c;但由于上述服…

获取当前鼠标的位置以及组件的位置

总结&#xff1a; div如果要触发鼠标事件要加上css样式cusor:pointer。 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

谷歌推大语言模型VideoPoet:文本图片皆可生成视频和音频

Google Research最近发布了一款名为VideoPoet的大型语言模型&#xff08;LLM&#xff09;&#xff0c;旨在解决当前视频生成领域的挑战。该领域近年来涌现出许多视频生成模型&#xff0c;但在生成连贯的大运动时仍存在瓶颈。现有领先模型要么生成较小的运动&#xff0c;要么在生…

java scala 获取类_在Scala 2.10中获取java.lang.Class [T]的Scala类型

您可以像这样实现您的方法&#xff1a;def getType[T](clazz: Class[T])(implicit runtimeMirror: ru.Mirror) runtimeMirror.classSymbol(clazz).toType然后像这样调用它&#xff1a;implicit val mirror ru.runtimeMirror(getClass.getClassLoader)getType(classOf[String])…

解决ios8下coreData没有NSPersistentContainer的问题

用Xcode8.1默认创建ios app的时候&#xff0c;使用coreData的话&#xff0c;要10.0以上的版本才行。因为NSPersistentContainer只有10.0以上的版本才有&#xff0c;10.0以下的版本是没有的&#xff0c;那怎么办呢&#xff1f;有办法&#xff0c;专为8.0版本加写的INSPersistent…

spring 与 guice 的区别好玩的好法(转)

看下边对于不同社会形态下一个人&#xff08;java对象&#xff0c;调用者&#xff09;需要一把斧子&#xff08;java对象&#xff0c;被调用者&#xff09;的例子&#xff1a;&#xff08;1&#xff09;原始社会时&#xff0c;劳动社会基本没有分工&#xff0c;需要斧子的人&am…

PyCon大会Python主题演讲摘要

PyCon 是全国际最大的以 Python 编程言语 为主题的技能大会。大会由 Python 社区组织&#xff0c;每年举行一次。在大会上&#xff0c;来自国际各地的 Python 用户与中心开发者齐聚一堂&#xff0c;共同同享 Python 国际的新鲜事、Python 言语的应用案例、运用技巧等等内容。 I…

欢迎使用Java 8之前要重温的10个JDK 7功能

Java 8发布已经快一个月了&#xff0c;我敢肯定&#xff0c;大家都在探索JDK 8的新功能。但是&#xff0c;在您完全研究Java 8之前&#xff0c;是时候重新审视Java 7上引入的一些很棒的功能了。记住&#xff0c;Java 6并没有什么功能&#xff0c;它只与JVM的更改和性能有关&…

java版本号管理_微服务项目中如何管理依赖版本号?

本文是微服务项目代码组织形式三部曲中的第三篇&#xff0c;也是最后一篇&#xff0c;通过这三篇文章&#xff0c;相信大家对于如果组织微服务中的代码已经有了一个基本认知&#xff0c;前面两篇分别是&#xff1a;第三篇相对来说要简单一些&#xff0c;本来没打算写&#xff0…

React之函数中的this指向

我们都知道在React中使用函数时&#xff0c;有两种写法&#xff0c;一是回调函数&#xff0c;二是直接调用&#xff0c;但需要在构造函数中绑定this&#xff0c;只有这样&#xff0c;函数中的this才指向本组件 总结一下没有绑定this的函数中的this指向 不管是在本组件的元素上调…

对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用!...

一级标题 # 空格 编写内容 二级标题 ## 空格 编写内容 有序内容 1.Tab 无序内容 -Tab 代码块 print("hello wrold") typora快捷键 ctrl1一级标题 添加图片 表格 CtrlT 姓名年龄职业谢国宏20IT文字加粗 24期的小伙伴们你们好 文字斜体 你好 又粗又斜 粗斜* 3**2 -- 幂…

struct和byte[]相互转换(用Marshal类实现)

转自[DotNet笔记]相当于序列化与反序列化&#xff0c;但是不用借助外部文件1、struct转换为byte[] 1staticbyte[] StructToBytes(objectstructObj) 2{ 3 int size Marshal.SizeOf(structObj); 4 IntPtr buffer Marshal.AllocHGlobal(size); 5 …

Get-CrmSetting返回Unable to connect to the remote server的解决办法

摘要: 微软动态CRM专家罗勇 &#xff0c;回复302或者20190125可方便获取本文&#xff0c;同时可以在第一间得到我发布的最新博文信息&#xff0c;follow me&#xff01;我的网站是 www.luoyong.me 。 在Dynamics 365部署管理器所在的服务器上执行Get-CrmSetting&#xff0c;最近…

使用ReentrantLock和Lambdas进行干净同步

最近&#xff0c;我在阅读一篇内容丰富的文章&#xff0c;内容涉及Javin Paul 1 synchronized和ReentrantLock之间的区别。 他强调了后者的优点&#xff0c;但并未保留一些缺点&#xff0c;这些缺点与正确使用所需的繁琐的try-finally块有关。 在同意他的陈述的同时&#xff0…

java 二维数组奇数金字塔_二维数组:奇数阶魔方 | 新思维:C语言程序设计

幻方&#xff0c;有时又称魔方&#xff0c;由一组排放在正方形中的整数组成&#xff0c;其每行、每列以及两条对角线上的数之和均相等。通常幻方由从到的连续整数组成。Siamese方法(Kraitchik 1942年&#xff0c;pp. 148-149)是构造奇数阶幻方的一种方法&#xff0c;说明如下&a…

react-性能优化

开发中遇到一个需要优化的性能&#xff0c;页面需要渲染很多table&#xff0c;而且可以自己添加table&#xff0c;所以就导致router改变时&#xff0c;清除这些DOM结构就会很慢&#xff0c;这就给用户造成不好的体验。 问题所在&#xff1a;清除渲染过多的DOM结构才导致迟缓&a…

Node.js学习(篇章一)

<node.js的特点> 采用了异步式I/O与事件驱动的架构设计&#xff0c;架构为单线程模型。 <supervisor包的作用> node.js开发项目&#xff0c;当修改项目时&#xff0c;需要终止进程重启Node.js之后才可以看到修改后的效果&#xff0c;为了解决这个问题&#xff0c;我…

WinXP启动时自动打开上次关机时未关闭的文件夹

不能自动打开上次关机时未关闭的文件夹解决方法&#xff1a; 首先运行注册表&#xff0c;解决方法&#xff1a;打开[\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] 在右面的窗口中新建DWORD类型键值“PersistBrowsers”&#xff0c;数据为…

机器学习前沿02

自动机器学习 https://mbd.baidu.com/newspage/data/landingsuper?context%7B%22nid%22%3A%22news_9244479631915180647%22%7D&n_type1&p_from3 卷积网络的综述 https://mbd.baidu.com/newspage/data/landingsuper?context%7B%22nid%22%3A%22news_979691604239366144…