在程序中,进行类型转换时常见的事,C#支持基本的强制类型转换方法,例如 
Object obj1 = new NewType();
NewType newValue = (NewType)obj1;
这样强制转换的时候,这个过程是不安全的,因此需要用try-catch语句进行保护,这样一来,比较安全的代码方式应如下所示:
Object obj1 = new NewType();
NewType newValue = null;
try
{
newValue = (NewType)obj1;
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
但是上面的写法在C#中已是过时的写法,也是比较低效的写法,比较高效且时尚的写法是用as操作符,如下:
Object obj1 = new NewType();
NewTYpe newValue = obj1 as NewType;
安全性:
as操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功,而且并不产生新的对象【当不成功的时候,会返回null】。因此用as进行类型转换是安全的。
效率:
当用as操作符进行类型转换的时候,首先判断当前对象的类型,当类型满足要求后才进行转换,而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,所以,相对来说,as效率高点。
需要注意的是,不管是传统的还是as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
if(newValue != null)
{
//Work with the object named “newValue“
}
但是,使用as操作符要注意以下几点:
1、不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue = new NewType();
NewTYpe1 newValue = newValue as NewTYpe1;
2、不能应用在值类型数据,即不能如下写(也会出现编译错误)
Object obj1 = 11;
int nValue = obj1 as int;
对于1.,可以用传统的类型转换方式完成:
NewTypeOne newTestOne = new NewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
要想使上面的操作正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码:
public calss NewTypeOne
{
public static explicit operator NewTypeTwo( NewTypeOne obj1)
{
//Convert object into new type
}
}
对于2,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,要完成如上操作,正确的写法如下:
Object obj1 = 11;
if(objTest is int )
{
int nValue = (int)obj1;
}
在C#中提供的很好的类型转换方式总结为:
Object => 已知引用类型——使用as操作符完成;
Object => 已知值类型——先使用is操作符来进行判断,再用类型强转换方式进行转换;
已知引用类型之间转换——首先需要相应类型提供转换函数,再用类型强转换方式进行转换;
已知值类型之间转换——最好使用系统提供的Conver类所涉及的静态方法。

第二篇

Is:检查对象是否与给定的类型兼容。例如,下面的代码可以确定MyObject类型的一个实例,或者对象是否从MyObject派生的一个类型:

if(obj is MyObject){}

如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。

如果已知表达式始终是true或始终是false,则is关键字将导致编译时警告,但是通常在运行时才计算类型兼容性。

注意:is运行符不能重载,is运行符只考虑引用转换、装箱转换和取消装箱转换。不考虑其它转换,如果用户定义转换。在Is运算符的左侧不允许使用匿名方法。lambda表达式属于例外。

Object myObject = new Object(); 
     Boolean b1 = (myObject is Object);      true.  
     Boolean b2 = (myObject is Employee);    false.
     如果对象引用是null,is运算符总是返回false,因为没有可检查其类型的对象。

is运算符通常像下面这样使用:

if (myObject is Employee)

{

Employee myEmployee = (Employee)myObject;

}

在这段代码中,CLR实际会检查两次对象的类型。is运算符首先核实myObject是否兼容于Employee类型。如果是,那么在if语句内部执行转换型,CLR会再次核实myObject是否引用一个Employee。CLR的类型检查增加了安全性,但这样对性能造成一定影响。这是因为CLR首先必须判断变量(myObject)引用的对象的实际类型。然后,CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(Employee)。由于这是一个相当常用的编程模式,所以C#专门提供了as运算符,目的就是简化这种代码写法,同时提升性能。

as:用于检查在兼容的引用类型之间执行某些类型的转换。

Employee myEmployee = myObject as Employee;

if (myEmployee != null)

{ }

在这段代码中,CLR核实myObject是否兼容于Employee类型;如果是,as会返回对同一个对象的一个非null

的引用。如果myObject不兼容于Employee类型,as运算符会返回null。

注意:as运算符造成CLR只校验一次对象的类型。if语句只是检查myEmployee是否为null。这个检查的速度比校验对象的类型快得多。

as运算符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常。相反,如果对象不能转换,结果就是null。所以,正确的做法是检查最终生成的一引用是否为null。如果企图直接使用最终生成的引用,会抛出一个System.NullReferenceException异常。以下代码对此进行了演示:

Object o = new Object();        新建一个Object对象。

Employee e = o as Employee;     将o转型为一个Employee

e.ToString();                   访问e会抛出一个NullReferenceException异常

备注:

as运算符类似于强制转换操作。但是无法进行转换,则as返回null而非引发异常。

示例:

expression as Type它等效于以下表达式,但是只计算一次expression。

expression is Type ?(Type)expression : (Type)null

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

C#中as用法的更多相关文章

  1. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  2. ORACLE 中ROWNUM用法总结(转)

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  3. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  4. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  5. .NET3.5中JSON用法以及封装JsonUtils工具类

    .NET3.5中JSON用法以及封装JsonUtils工具类  我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...

  6. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  7. Android开发中Bundle用法包裹数据(转)

    Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...

  8. 转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

    转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在 ...

  9. SQL 中ROLLUP 用法

    SQL 中ROLLUP 用法 ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集. 下面是 CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有 ...

  10. MVC 中DropDownList 用法

    MVC 中DropDownList  用法 后台 Dictionary<string, int> dc = new Dictionary<string, int>(); dc. ...

随机推荐

  1. ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)

    思路: 将4个串每个串都反向这样得到新的四个串一共8个串,对于母串每个位置检测这个串能不能放进去,hs或者后缀数组都可以.然后dp[i][j]  (0<i<len  0<=j< ...

  2. Pythonn 内置函数

    abs 绝对值 n = abs(-1) print(n) ========================= /usr/bin/python3.5 /home/liangml/pythonscript ...

  3. IHttpHandler给图片加水印

    /// <summary> /// WaterMarkHandlher 的摘要说明 /// </summary> public class WaterMarkHandlher ...

  4. ROS语音交互——科大讯飞语音合成TTS(二)

    之前我用过科大讯飞的语音包,为了记录一下我重新使用一下 首先注册科大讯飞账号及应用,以后每个下载的在线使用SDK都是以此账户ID登录讯飞语音服务器. 下载科大讯飞在线合成包. $ unzip Linu ...

  5. sql 2008 修改链接服务器 Rpc &Rpc Out

    From: http://blog.csdn.net/gnolhh168/article/details/41725873 USE [master] GO EXEC master.dbo.sp_ser ...

  6. J2EE、J2SE、J2ME是什么意思?

    本文介绍Java的三大块:J2EE.J2SE和J2ME.J2SE就是Java2的标准版,主要用于桌面应用软件的编程:J2ME主要应用于嵌入是系统开发,如手机和PDA的编程:J2EE是Java2的企业版 ...

  7. 关于aggregation 语法和表达式大全(最新3.4版)

    用mongodb四年多了,从1.8版用到目前的3.4版,功能越来越强大,而且它的每一次升级带给我的都是惊喜,最近发现他的aggregation(管道)技术越来越丰富了,基本上将它提供的所有功能都集成了 ...

  8. 怎样用SQL语句查询一个数据库中的所有表?

    怎样用SQL语句查询一个数据库中的所有表?  --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...

  9. 对Spring AOP的理解

    AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善. AOP在spring ...

  10. opacity与RGBA透明的区别

    为什么不使用opacityCSS3 还允许通过opacity 声明来设置元素的透明度.该透明度的值也是一个介于0 到1 之间的小数(如将opacity 设置为0.1 表示为10%透明).但是这种透明度 ...