在C#中,我们可以使用is as操作符来判断某数据类型和其它指定类型的关系

1. 用is运算符验证基础类型

C#允许在继承链中向下转型,所以如果DerivedClass派生自BaseClass,那么DerivedClass a; a is BaseClass返回true

2. 用as而不是强制转换

as运算符在某些情况下能代替强制转换操作,我们推荐使用as而不是以前的强制转换,因为普通的强制转换如果失败,会抛出一个需要处理的异常;但是as转换如果失败,仅是把转换结果变为null,而不是抛出一个异常。

3. as是is的语法糖

下面两段代码是一个效果

1Foo f = x as Foo;
2
3var temp = x;
4Foo f = (temp is Foo) ? (Foo)temp : (Foo)null;

具体参见Eric大大的blog

http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx

4. as 不是万能转换器

例如:用户自定义转换

 1ClassA{
2
3publicstaticexplicitoperator ClassB (ClassA a){
4
5returnnew ClassB();
6
7}
8
9}
10
11ClassA a=new ClassA();
12
13ClassB b;
14
15b=(ClassA)a;//正确。通过自定义转换
16
17b=a as ClassB;//返回null。is判断就不会通过

 as运算符只执行引用转换和装箱转换。

as运算符无法执行其他转换,如用户定义的转换,这类转换应使用case表达式来代替其执行。

虽说as是is的语法糖,但是is能够用于不可为空类型判断,而as就不能。

"a as int;"这样的代码会错误,除非是“a as int?;”,“ a is int”这样的代码就是没问题的

int a=3;
Console.WriteLine ( a isint );//正常判断,输出true
int? b = a asint?;//正常转换
int c = a asint;//报错:as不能用于不能为null的类型转换

5. 总结

1. as是is的语法糖,即as是否能正确转换,内部还是靠is的验证的。

1.1. 虽说是语法糖,但是is能作用于不可为空类型(例如:值类型),as不能作用于此类型

2. as比强制转换能好,毕竟转换失败它不会抛出异常。

3. as不是万能的,例如强制转换能够处理“用户自定义转换”,而as就不行了。

6. 鸣谢

语法糖理论:@刀 刀,@地狱门神,@坎普利特

as不能作用于不能为空的类型转换,而is就可以:@Zhenway

提出编码错误:@pandaren,@_冻结_

实践出真知:@Snokye

及各位耐心阅读并提出意见的朋友 :)

还有其它不正确的地方请多多指教 !

as和is,但is也有as所没有的功能[C#] --转载 甘木的更多相关文章

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. H5实现摇一摇技术总结

    摇一摇遇到的问题 一.如何对摇晃效果进行反馈 刚开始的处理方式是,摇晃过程中不做任何处理,但后来反馈说这种效果不好,好像就没有摇动一样,如果声音也不响的话,就真的和什么都没发生一样. 后来想了想,加入 ...

  4. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  5. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  7. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  8. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  9. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  10. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

随机推荐

  1. wadl 的自动生成(cxf版本2.7.6)

    参考文档 http://cxf.apache.org/docs/jaxrs-services-description.html 获取项目 git@github.com:witaste/cxf-2.7. ...

  2. 制作一个导航卫星绕地球转动的3D Flash动画

    为便于了解卫星发射以及绕地球运转的过程,制作此动画.

  3. Codeforces735D Taxes 2016-12-13 12:14 56人阅读 评论(0) 收藏

    D. Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  4. 团队博客-第六周:Alpha阶段项目复审(科利尔拉弗队)

    团队的排名-点评:以下排名点评谨代表个人观点,如有冒犯,评论联系删除 小组名字和链接 优点 缺点,bug报告(至少140字) 最终名次(无并列) 中午吃啥队 微信小程序应用,新型app会是一个便利的使 ...

  5. jquery使用ajax报错[Uncaught SyntaxError: Unexpected token :]

    $.post('/ajax/validate.do',{"id": id},function(ret){ //ret }); 返回值明明是json,格式也是正确的,却解析不成功,在 ...

  6. 教程-Delphi调用百度地图API(XE8+WIN7)

    unit U_map; interface //---------------------------------------------------// //----------COPY BY 无言 ...

  7. linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction

    一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct ...

  8. c#获取word文件页数、字数

    引用命名空间:using Microsoft.Office.Interop.Word; //启动Word程序 Application myWordApp = new ApplicationClass( ...

  9. echarts呈现数据表图形

    讲一下echarts的用法,列举了两个图表,一个是单柱图,一个是多柱图,至于饼状图,只许更改echarts的类型就好了 一.首先是要两个div,用来存放两个图表 <div class=" ...

  10. js判断是否是数组

    //判断是否是数组function isArray(obj) {     return Object.prototype.toString.call(obj) === '[object Array]' ...