前言:

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

在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

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

  1. as和强制类型转换的区别

    之前一直以为as就是强制类型转换,只是as是AS3中新的语法,之前用在有继承关系的对象之间的转换也无甚区别,但是今天却让我领悟到了它俩之间的区别. 原起:今天要给ColorPicker控件动态赋值,它 ...

  2. C++中四种强制类型转换的区别

    使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast. 1.static_cast     用法:static_cast ...

  3. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  4. C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  5. 《你不知道的JavaScript》整理(六)——强制类型转换

    JavaScript中通常分为两种类型转换,"隐式强制类型转换"(implicit coercion)和"显式强制类型转换"(explicit coercion ...

  6. (每日一练)强制类型转换和自动类型转换的区别

    自动类型转换就是自发的进行,自动类型转换就相当于把小的水桶里面的水装到大的里面去 比如 int a = 10 double b = a: 强制类型转换是强制性的,将容量大的类型转换到容量小的类型,前提 ...

  7. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  8. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  9. 隐式转换和显式转换及强制转换的区别

    string strType = "123"; object objType= (object)strType;//可以不要,隐式转换, 要的为显式转换 string strTyp ...

最新文章

  1. 湖南科技学院计算机科学与技术分数,湖南科技学院计算机科学与技术专业2016年在河南理科高考录取最低分数线...
  2. python自动化办公 百度网盘-Python自动化办公实战教程2020最新带源码
  3. Spring注解使用方法
  4. firebird——Spring hibernate 集成连接配置
  5. tampermonkey参数
  6. 阿里巴巴HBase高可用8年填坑实录
  7. filter 中用spring StopWatch 监控请求执行时间
  8. node.js中对Event Loop事件循环的理解
  9. MYSQL Training: MySQL I
  10. 求求你,下次面试别再问我什么是 Spring AOP 和代理了!
  11. win7变成xp风格了怎么改回_win7桌面怎么改成xp风格
  12. Windows 7语言包下载
  13. JavaScript系列之去掉字符串前后的空格
  14. thread-specific stroage模式 一个线程一个储物柜
  15. Power BI(十二)Power Pivot时间智能函数
  16. 情侣的网站代码java_GitHub - 90x64/lovers-website: 程序员的情侣网站 (programmer's website of lovers)...
  17. 【UCIe】UCIe NOP 介绍
  18. 经纬度与距离的换算关系
  19. 快速将图片背景去掉教程
  20. gen8服务器性能,HP助AMD平台Gen8服务器提高性能

热门文章

  1. 设置腾讯云linux服务器中 MySQL 允许远程访问
  2. JVM 常见异常及内存诊断
  3. Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)
  4. https://blog.csdn.net/blmoistawinde/article/details/84329103
  5. LeetCode简单题之重新排列数组
  6. TVM实现hardware backend
  7. Ascend Pytorch算子功能验证
  8. 新兴解决方案增强了电动汽车电源(功耗)管理
  9. CVPR2020:4D点云语义分割网络(SpSequenceNet)
  10. 中原大学 php,台湾中原大学php教程孙仲岳主讲