当前位置: 首页 > 编程日记 > 正文

As与强制类型转换的区别以及Is运算符的使用

前言:

开发人员经常需要将一个对象从一个类型转换成其他类型。

在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换

CLR(参考:http://baike.baidu.com/view/605055.htm)允许将一个对象强制转换成它的类型或者是它的任何基类型。每种编程语言都规定了具体如何将转型操作揭示给开发人员。例如C#不需要任何特殊语法即可将一个对象强制转换成它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换。然而,C#要求开发人将一个对象显式转换成它的任何派生类型,因为这样的转型可能在运行时失败

using System;namespace ConsoleApplication1
{class C1 { };//该式隐式从System.Object派生class Program{static void Main(string[] args){//向基类型转换不需要转型Object o = new C1();//向派生类型转换需要转型C1 c = (C1)o;}}
}

参考:http://blog.csdn.net/haoyuan711/article/details/5917806

隐式转换中,基类型不能访问派生类中的特有部分(如上的代码,c2.a不能通过编译),且派生类对象指针不能引用基类对象地址,即容易发生信息丢失,因此C#提供了显示转换(强制转换)

强制转换一般是由精度较高数据向精度较低数据转换或者是父类向子类的转换,一般不会发生信息丢失,但是在强制类型转换的过程中,值类型可能会出现溢出错误,而引用类型的强制类型转换则容易出现类型不兼容的错误。处理方法有两种

1、用try...catch捕获异常

2、用is或是as来检查一个对象是否兼容于其他指定的对象

在C#中使用is和as操作符来进行强制类型转换

MSDN(is操作符):http://msdn.microsoft.com/zh-cn/library/scekt9xw.aspx

using System;namespace ConsoleApplication5
{class Class1 { };class Class2 { };class Class3 : Class2 { };class IsTest{static void Test(object o){Class1 a;Class2 b;if (o is Class1){Console.WriteLine("o is Class1");a = (Class1)o;}else if (o is Class2){Console.WriteLine("o is Class2");b = (Class2)o;}else{Console.WriteLine("o is neither Class1 nor Class2");}}static void Main(string[] args){Class1 c1 = new Class1();Class2 c2 = new Class2();Class3 c3 = new Class3();Test(c1);Test(c2);Test(c3);Test("string");Console.ReadKey();/*Output:o is Class1o is Class2o is Class2o is neither Class1 nor Class2.*/}}
}

is操作符检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或false。
关于is操作符有一下几点说明:

1、is操作符永远不会抛出异常

2、is会核实对象是否兼容于指定类型,对象派生自指定类型称作兼容

    class Class2 { };class Class3 : Class2 { };class IsTest{static void Test(object o){Class1 a;Class2 b;Class3 c0 = new Class3();Console.WriteLine(c0 is Class2);Class2 c1 = new Class2();Console.WriteLine(c1 is Class3);//结果:True// False

3、is 运算符只考虑引用转换、装箱转换和取消装箱转换。 不考虑其他转换,如用户定义的转换。

  PS:用户定义的转换:http://msdn.microsoft.com/zh-cn/library/aa691298(v=vs.71).aspx

               http://msdn.microsoft.com/zh-cn/library/aa664464(v=vs.71).aspx

4、is操作符可以检查值类型的兼容性,但仅限于同种类型(返回True),不同类型(例如int和double)则返回False

using System;namespace ConsoleApplication3
{class Program{static void Main(string[] args){double a = 2;Boolean b1 = a is double;Console.WriteLine(b1);//返回True

5、Is操作符执行类型转换的常用编程模式

            if (o is Class1){Class1 a = (Class1)o;

CLR实际检查了两次对象的类型,is操作符首先核实o是否兼容于Class1类型,如果答案是肯定的,CLR会再次核实o是否引用一个Class1.CLR的类型检查增强了安全性,但无疑也会对性能造成一定影响

AS操作符

as 运算符用于在兼容的引用类型之间执行某些类型的转换

注意,as 运算符只执行引用转换和装箱转换。 as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用强制转换表达式来执行。

AS的工作方式和强制转换一样,只是它永远不抛出异常

using System;namespace ConsoleApplication4
{class ClassA { }class ClassB : ClassA { }class ClassC { }class MainClass{static void Main(){object[] objArray = new object[3];objArray[0] = new ClassA();objArray[1] = new ClassB();objArray[2] = new ClassC();for (int i = 0; i < objArray.Length; ++i){ClassA s = objArray[i] as ClassA ;Console.Write("{0}:", i);if (s != null){Console.WriteLine("兼容于ClassA'");}else{Console.WriteLine("不兼容于ClassA");}}Console.ReadKey();}}
}
/*
Output:
0:兼容于ClassA'
1:兼容于ClassA'
2不兼容于ClassA*/

在AS操作符下的常用编程模式:
Class2 c2 = c1 as Class1;

if (c2 != null)

{}

这种编程模式替代了is操作符的类型转换的编程模式,简化了其代码的写法,同时提高了性能

关于AS操作符,有一下几点说明

1、只能对引用类型或者是值可以为null的类型操作

2、不要与is同时使用

转载于:https://www.cnblogs.com/2011201489-zgm/archive/2012/04/20/2459543.html

相关文章:

SQL命令执行数据库备份

backup database XXXXX to diskD:\Bak\BACKUP.bak with init XXXXX是数据库名字转载于:https://www.cnblogs.com/lx0831/archive/2009/04/07/1431115.html

【硬件基础】振荡(时钟)周期、状态周期、机械周期、指令周期

前言&#xff1a; 尽管关于单片机的各种周期在网上随便一查就能查到&#xff0c;但于博主个人而言容易搞混&#xff0c;于复习定时器时决定写下这篇博客&#xff0c;相当于一次知识复习总结 振荡&#xff08;时钟&#xff09;周期&#xff1a; 以12M的单片机为例&#xff0c;其…

14条改善jquery代码的建议

2019独角兽企业重金招聘Python工程师标准>>> 从国外网站找到的。 http://www.tripwiremagazine.com/ajax/developer-toolbox/more-jquery-and-general-javascript-tips-to-improve-your-code.html 很有用。 转载于:https://my.oschina.net/dlpinghailinfeng/blog/26…

HDFS配额查询

### 查看目录配额 hdfs dfs -count -q -h /user/hive/warehouse/db_name.db ### 查看整个HDFS的空间大小 hdfs dfs -df -h /user/ Filesystem Size Used Available Use% hdfs://hdfs01 10 P 8 P 2 P 80%### 查看指定目录/数据库的大小 hdfs …

# 命令行新建 job 错误: ORA-01008 并非所有变量都已绑定 。

# 命令行新建 job 错误: ORA-01008 并非所有变量都已绑定 。 1、改正前代码: DECLARE job NUMBER; begin sys.dbms_job.submit(job > :job, what > P_AUTO_FETCH_RECORDS;, next_date > to_date(10-05-2011 15:58:35, dd-mm-yyyy hh24:mi:ss), interval > s…

【单片机】以输出方波为例的 定时器使用

实验要求&#xff1a; 利用Proteus软件画出电路图&#xff0c;单片机定时器/计数器以查询方式工作&#xff0c;在P1.0口产生周期为100us的连续方波&#xff0c;在P1.0口线上接上示波器观察波形。 前言&#xff1a;写这篇博客的意义在于&#xff0c;借助本实验可以复习定时器中断…

经典GNA整理

最近学习了各种GAN的结构。在此记录下。 转载于:https://www.cnblogs.com/yeran/p/11251842.html

Global.asax

GlobalFilterCollectionRepresents a classthat contains all the globalfilters.HandleErrorAttributemvc中提供了HandleErrorAttribute特性&#xff0c;该特性用于处理由操作方法引发的异常AreaRegistration.RegisterAllAreas();注册 ASP.NET MVC 应用程序中的所有区域RouteC…

leetcode_1. Two Sum

leetcode_1. Two Sum 前言&#xff1a; 这段时间开始敲leetcode。我认为这并不仅仅只是为了应付笔试&#xff0c;面试。而是确实有着一定的意义。 尤其&#xff0c;你提交代码后&#xff0c;网站会多方面验证你的答案。 另外&#xff0c;提交成功后&#xff0c;你可以查看自己的…

linux ngxtop安装安装及使用

写在前面&#xff1a; ngxtop是Nginx日志实时分析利器 1.下载 下载地址&#xff1a;https://github.com/lebinh/ngxtop 下载zip文件到本地 登录linux服务器&#xff0c;定位到安装目录&#xff0c;执行 rz&#xff0c;选中上一步下载的zip文件&#xff0c;上传完成后执行unzip…

POJ1088(滑雪)

题目链接 动态规划题。 题目大意&#xff1a;给定一个二维数组&#xff0c;数组中每个数代表一个高度&#xff0c;每次只能向相邻且高度下降的方向移动&#xff0c;求最长的移动距离。 View Code 1 #include <stdio.h>2 #include <memory.h>3 #define MAX(a,b) ((…

【硬件基础】个人感悟+C语言 引入头文件时引号括号的区别

前言&#xff1a; 惊&#xff01;一博主又在水博客 其实不然&#xff0c;单片机从大一下半年就已经开始自学&#xff0c;但是可能是由于高中养成的惰性思维&#xff0c;不愿意思考&#xff0c;只想靠时间来获得内心的满足感&#xff1a;看我今天又学了一天。其实&#xff0c;假…

走在网页游戏开发的路上(八)

游戏中定时器的设计 0. 前言 在游戏开发中计时器/定时器是必须的&#xff0c;而且会在多处用到&#xff0c;如吃药补血每秒回10点且持续1分钟、玩家从一点到达另一点的过程需要多少时间。下面是定时器在七雄争霸中的几个应用场景&#xff0c;直接上图&#xff1a; 场景1&#…

[epoll]epoll理解

转自&#xff1a;http://blog.51cto.com/yaocoder/888374 1. 流 首先我们来定义流的概念&#xff0c;一个流可以是文件&#xff0c;socket&#xff0c;pipe等等&#xff0c;可以进行I/O操作的内核对象&#xff0c;不管是文件&#xff0c;还是套接字&#xff0c;还是管道&#x…

[kuangbin带你飞]专题五 并查集 E - 食物链 (带权并查集)

E - 食物链 题目链接&#xff1a;https://vjudge.net/contest/66964#problem/E 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种…

关于内网linux系统如果安装nodejs,npm,express,mongodb,forever等

内网的linux系统要安装nodejs以及express等系列的框架&#xff0c;因为系统是局域网和互联网是物理隔离的&#xff0c;所以&#xff0c;没法像官网的安装教程那样直接install了&#xff0c;只能手动安装&#xff0c;这里已经我们自己的linux 系统suse10 为例&#xff1a; 1 No…

【基础知识】如何在word中粘贴出漂亮整洁的代码

使用工具&#xff1a; notepad、WPS 操作实现&#xff1a; 1、右击代码文件使用NPP打开文件 2、选中要复制的代码 3、如图所示&#xff0c;依次点击如下内容 4、直接粘贴到word中&#xff0c;如图

浅析SQL Server数据修复命令DBCC的使用

SQL Server数据库提供了修复命令DBCC&#xff0c;当SQL Server数据库遭到质疑或者是有的无法完成读取时可以尝试用此命令来修复。以下是一些常见的DBCC修复命令&#xff0c;希望会给读者带来帮助。 1. DBCC CHECKDB 重启服务器后&#xff0c;在没有进行任何操作的情况下&#x…

Python之Mysql及SQLAlchemy操作总结

一、Mysql命令总结 1.创建库 create database test1; 2.授权一个用户 grant all privileges on *.* to feng% identified by 1qazWSX; 3.创建表 create table Teacher(teaId int not null, teaname varchar(100), age int, sex enum(M, F), phone int); 4.查询 select * from t…

NSwagStudio for Swagger Api

本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client 1、运行WebApi项目 URL http://yourserver/swagger 然后你将看到界面如下 1.1 Web API 代…

【html】如何解决标签设置成超链接后字体格式及颜色变化的问题

问题描述&#xff1a; 如图所示&#xff0c;将一个标签设置成超链接后字体颜色和格式会发生改变&#xff0c;如果我只想让它保持原来的格式应该怎么办&#xff1f; 解决方法&#xff1a; 在a标签中添加一个属性&#xff1a; style"color:inherit;" 添加后的代码&…

js判断 IE 浏览器

1 $.browser.msie && ($.browser.version 6.0) 转载于:https://www.cnblogs.com/zhupinglei/archive/2012/04/28/2475186.html

UNIX编程笔记:关于停止的进程接收信号的问题

为什么80%的码农都做不了架构师&#xff1f;>>> 因为资料缺少&#xff0c;按照测试得出来&#xff0c;停止状态的进程貌似只对SIGCONT有反应&#xff0c;而别的默认就是忽略。 转载于:https://my.oschina.net/kut/blog/27736

脱壳 VMProtect 1.70.4

【文章标题】: 脱壳 VMProtect 1.70.4 【文章作者】: hxqlky【作者邮箱】: zmunlkygmail.com【作者主页】: http://www.x5dj.com/hxqlky【下载地址】: 自己搜索下载【加壳方式】: VMProtect 1.70.4【保护方式】: VMProtect 1.70.4【编写语言】: MASM32 / TASM32 【使用工具】:…

互联网协议详解

本文转载自&#xff1a;https://www.cnblogs.com/111testing/p/6942585.html 目录&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a; 一、网络协议 二、TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP头格式…

【java】巨菜博主安装jdk为什么每次都失败?

今天到公司实习第一天&#xff0c;博主兴高采烈地的使用起来的公司配备的电脑&#xff0c;第一步是干啥&#xff1f;当然是安装JDK了&#xff0c;博主平生安装JDK次数数不胜数&#xff0c;但一遍整下来没有任何差错的情况少之又少。今天也不例外&#xff0c;多敲了个空格害我足…

怎么在vs2010中使用ActiveX Test Container(转)

ActiveX Test Container Application is Still Available(转) Hello, I’m Pat Brenner, a developer on the Visual C Libraries team. I’ve noticed some posts on various forums lamenting the loss of the ActiveX Test Container application and I wanted to address …

C#自定义控件四简易时钟

C#自定义控件四简易时钟效果图&#xff1a;简易时钟&#xff0c;顾名思义&#xff0c;简单容易&#xff0c;简单到什么程度呢&#xff1f;界面只有数字和指针&#xff0c;甚至连与当前时间都不能匹配&#xff01;呵呵&#xff01;就这么简单&#xff0c;学习嘛&#xff0c;从简…

GitLab 配置邮箱

设置 SMTP 发送邮件 这里以腾讯企业邮箱为例&#xff0c;其他邮箱可以参考 设置 SMTP 发送邮件。 SMTP 和 POP3/IMAP 协议 SMTP 负责发送邮件&#xff0c;POP3/IMAP 负责接收邮件。其中 IMAP 基本上替换掉了 POP3。 用户在使用客户端&#xff08;例如 Foxmail&#xff09;时&am…

在 Ubuntu Natty 中解除系统托盘限制

在 Ubuntu 11.04 Natty 中&#xff0c;Ubuntu 对顶部面板右上角的通知区域&#xff08;系统托盘&#xff09;采用了白名单制度&#xff0c;只有支持 Indicators 并位于白名单的部分程序才会被显示在系统托盘中&#xff0c;目前支持的程序有&#xff1a; Java apps, Mumble, Win…