as和is,但is也有as所没有的功能[C#] --转载 甘木
在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
实践出真知:@Snokye
及各位耐心阅读并提出意见的朋友 :)
还有其它不正确的地方请多多指教 !
as和is,但is也有as所没有的功能[C#] --转载 甘木的更多相关文章
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- H5实现摇一摇技术总结
摇一摇遇到的问题 一.如何对摇晃效果进行反馈 刚开始的处理方式是,摇晃过程中不做任何处理,但后来反馈说这种效果不好,好像就没有摇动一样,如果声音也不响的话,就真的和什么都没发生一样. 后来想了想,加入 ...
- Fis3前端工程化之项目实战
Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...
- 【AR实验室】mulberryAR : ORBSLAM2+VVSION
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
随机推荐
- vs2015 cmd.exe已退出 代码为1
https://blog.csdn.net/changbin91/article/details/42874377?utm_source=blogxgwz0 https://blog.csdn.net ...
- Get User CustomNotificationAddresses
select pv.StringValue, * from tbl_Identity i left join tbl_PropertyValue pv on pv.ArtifactId=conv ...
- ASP.NET MVC Ajax 伪造请求
1.前言 CSRF(Cross-site request forgery)跨站请求伪造,ASP.NET MVC 应用通过使用AJAX请求来提升用户体验,浏览器开发者工具可以一览众山小,就很容易伪造了请 ...
- Angular6 学习笔记——组件详解之组件通讯
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- “System.Runtime.InteropServices.COMException”类型的第一次机会异常在 System.Windows.Forms.dll 中发生
最近做一个winform项目,在里面用了webbrowser控件进行html文档打印,遇到了标题所示问题.根据查到的一些资料,在调试>异常>查找中输入“System.Runtime.Int ...
- 移植Max中的控制器到Unity - 前言
一切源自于一个ppt http://pan.baidu.com/s/1kT8x2V9 看到这个ppt之前,其实自己也想过将Max当中的一些约束移植到游戏中,一方面是那时候能力不足,另一方面还是自己不那 ...
- 附2 volatile
注:在阅读本章之前,先要了解Java内存模型,见上一章<附1 Java内存模型与共享变量可见性>,链接如下: http://www.cnblogs.com/java-zhao/p/5124 ...
- NPOI 导出excel 通用方法
public static byte[] ExportExcel<T>(Dictionary<string, string> columnsHeader, List<T& ...
- python+pcap+dpkt 抓包小实例
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...
- Java基础学习篇---------String、集合的学习
一.String常用的方法: 1. == 实质比较两个对象的地址数值 String a = "hello" (hello为匿名对象) String a1 = "hell ...