C# is和as操作符
is和as操作符
is操作符:检查对象是否与给定类型兼容。
说明:
1、如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true,否则返回false。
(1):表达式为空:返回false
//表达式为空
object oo = null;
bool isstudent3 = oo is student;
(2):表达式内容不为空,但强制转换类型时发生异常,返回false
oo = new object();
bool isstudent4 = oo is student;
(3):表达式为null时,并不会抛异常,因为没有正确的对象来做类型验证。
2、is操作符只考虑引用转换、装箱转换和取消装箱转换。下面的程序都会发生编译时错误(CTE):已知表达式将始终是 true 或始终是 false
int i=5;
if (i is decimal )
{
//提示:给定表达式始终不是所提供的("decimal")类型
}
if (i is int)
{
//给定表达式始终为所提供的("int")类型
}
3、不能重载is操作符。
4、"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式。
if ((delegate(int i) { return i; }) is testdelegate)
{
//提示:"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式
}
if (((x) => { return x; }) is testdelegate)
{
//提示:"is"或"as"运算符的第一个操作数不能是lambda表达式或匿名表达式
}
as 运算符:用于在兼容的引用类型之间执行转换。
说明:
1、as操作符类似于强制转换,但又有区别,当对象为null时,不会抛异常而是会返回null。
object _object = null;
student _s = _object as student;
object as student其实相当于_object is student?(student)_object:null;
之所以这样说,我们可以从两者的IL代码中看出些结论:首先我们实例化个基类对象。
object o = new student();
然后分别执行:
(1) o is student,对应IL代码
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 18 (0x12)
.maxstack 2
.locals init ([0] object o,
[1] bool isstudent2)
IL_0000: nop
IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: isinst JmTest.ConsoleApplication1.student
IL_000d: ldnull
IL_000e: cgt.un
IL_0010: stloc.1
IL_0011: ret
} // end of method Program::Main
(2) o as student,对应IL代码
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 15 (0xf)
.maxstack 1
.locals init ([0] object o,
[1] class JmTest.ConsoleApplication1.student s2)
IL_0000: nop
IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: isinst JmTest.ConsoleApplication1.student
IL_000d: stloc.1
IL_000e: ret
} // end of method Program::Main
小结:两段IL代码都执行了isinst,它代表的意思是:测试对象引用是否为特定类的实例,在as操作符后面有一个stloc.1它代表的意思是:从计算堆栈的顶部弹出当前值到索引1处的局部变量列表中。从这两条IL语句的用途可以说明is和as操作符的部分关系。
2、as 运算符只执行引用转换和装箱转换,无法执行其他转换。下面的代码是错误的:
object _object = null;
student _s = _object as student;
//试图将一个对象转换成委托
testdelegate test = _s as testdelegate;
C# is和as操作符的更多相关文章
- Oracle 的基本操作符
!= 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- oracle操作符
Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 = 2.5 比较操作符: 其中等号可以换成其他运算符:(后面为该操作符的单条件查询样例 ...
- C# 本质论 第三章 操作符和控制流
操作符通常分为3大类:一元操作符(正.负).二元操作符(加.减.乘.除.取余)和三元操作符( condition?consequence:alternative(consequence和alterna ...
- SQL优化技术分析-1:操作符优化
1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL 性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
- Linux Shell脚本逻辑操作符简介
在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...
- SQL操作符
Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...
- PHP中::、->、self、$this操作符的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...
随机推荐
- JS开发者常用的10个Sublime Text插件
Sublime Text 是每个开发者工具箱中都应该有的一个强大的应用.它是一个跨平台的.高定制化的.高级的文本编辑器,在功能强大的 集成开发环境(众所周知地消耗资源)和类似于 Vim 或 Emacs ...
- codefoces round193a
link: http://codeforces.com/contest/332/problem/A /* ID: zypz4571 LANG: C++ TASK: 193a.cpp */ #inclu ...
- leetcode 144. Binary Tree Preorder Traversal ----- java
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- 希赛网 > 问答 > 数据库 > MySQL数据库 > MySQL的管理与维护 > MySql开启远程用户登录GRANTALLPRIVILEGESON*.*TO'root'@'%'I MySql开启远程用户登录GRANTALLPRIVILEGESON*.*TO'root'@'%'I
MySql开启远程用户登录 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'huawei' WITH GRANT OPTION; FL ...
- URAL-1989 Subpalindromes(单点更新+hash)
题目大意:给一行字符串,两种操作:change(pos,char),将pos处字符改为char:isPalindrome(i,j),询问[i,j]之间是否为回文字符串. 题目分析:做正反两次字符串哈希 ...
- MAC 如何修改PATH
http://hathaway.cc/post/69201163472/how-to-edit-your-path-environment-variables-on-mac
- 转贴:sudo apt-get install 可以安装的一些软件
Ubuntu 下的一些软件安装sudo apt-get install virtualbox#华主席推荐 2007年年度最佳软件,最佳编辑选择奖得主.....sudo apt-get install ...
- kuangbin_UnionFind J (POJ 2492)
加权并查集mod2模板 本体的难点是bug的释义(笑) #include <iostream> #include <string> #include <cstdio> ...
- [AHOI 2006][BZOJ 1269]文本编辑器editor
好吧,我承认这是我用来刷随笔数的喵~ 这是一道 splay 裸题,但还是有想本傻 X 一样根本不会写 splay 的,于是乎又用 treap 水过了 splay 的常数我还是知道的,所以真是不知道那些 ...
- ps互补色
色彩中的互补色有红色与绿色互补,蓝色与橙色互补,紫色与黄色互补.在光学中指两种色光以适当的比例混合而能产生白光时,则这两种颜色就称为“互为补色”. 互补色是相对的混合的白色 互补色:在色环中某种颜色的 ...