提高C#编程水平的50个要点 之三“在 as 和 强制类型转换之间,优先使用 as 操作符”。
来源:互联网 发布:luastudio for mac 编辑:程序博客网 时间:2024/06/18 00:57
<程序代码>
NewType newValue = (NewType)objTest;
但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要用try-catch语句来进行保护。这样一来,比较安全的代码方式应该如下所示。
object objTest = new NewType();
NewType newValue = null;
try
{
newValue = (NewType)objTest;
}
catch( Exception err )
{
MessageBox.Show( err.Message );
}
但是如上的写法在C#中已经属于过时的写法,而且也属于比较低效的写法。在C#中比较高效而且安全的写法,应该用as操作符,那么完成如上类似功能的正确代码应该如下。
object objTest = new NewType();
NewType newValue = objTest as NewType;
那么很明显,如上的写法首先看起来很简便,至少代码数量和强转方式一样。至于安全性,对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。
要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
{
//Work with the object named "newValue"
}
但是,使用as操作符有如下几点限制。
第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;
第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。
object objTest = 11;
int nValue = objTest as int;
对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。
NewTypeOne newTestOne = new NewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。
public class NewTypeOne
{
public static explicit operator NewTypeTwo( NewTypeOne objTest )
{
//Convert object into new type
}
}
对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。
object objTest = 11;
if( objTest is int )
{
int nValue = (int)objTest;
}
除了如上两点限制外,在用as操作符来进行类型转换的时候,有个细微的问题。在前面所说的,用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,那么这样就有个问题,即用as操作符来进行类型转换的时候无法转换成正确的类型,也就是说本来应该转换成子类型,却转换成了父类型。但是我并不认为这是个严重问题,因为在用as操作符来进行类型转换的时候,如何选择目标类型在编码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父类型对象进行操作;反之亦然。
在C#中已经提供了一个很好的类型转换方式,那么在进行类型转换的时候,可以按照如下的方式进行选择。
类型转换 使用选择
Object转换已知引用类型 使用as操作符来完成
Object 转换已知值类型 先使用is操作符来进行判断,再用类型强转方式进行转换
已知引用类型之间转换 首先需要相应类型提供转换函数,再用类型强转方式进行转换
已知值类型之间转换 最好使用系统提供的Convert类所涉及的静态方法
- 提高C#编程水平的50个要点 之三“在 as 和 强制类型转换之间,优先使用 as 操作符”。
- 提高C#编程水平的50个要点 1.总是用属性 (Property) 来代替可访问的数据成员 2.在 readonly 和 const 之间,优先使用 readonly 3.在 as 和 强制类型转换之
- 3. 在 as 和 强制类型转换之间,优先使用 as 操作符。
- 提高C#编程水平的50个要点 之二“在 readonly 和 const 之间,优先使用 readonly”
- 提高C#编程水平的50个要点 之六 “区别值类型和引用类型”。
- 读书笔记之C#的is和as操作符强制类型转换
- 读书笔记之C#的is和as操作符强制类型转换收藏
- 提高C#编程水平的50个要点 之十一“在编写循环时,优先使用foreach”
- 【C#高效编程50例】条目3:使用is 或 as 操作符而不是强制类型转换
- 提高C#编程水平的50个要点 之七 “使用不可变的值类型(Immutable Atomic Value Types)”。
- 提高C#编程水平的50个要点 之九“理解Reference Equals(), static Equals(), instance Equals(), 和运算行符==之间的关系”
- C#的as, is和类型强制转换
- 提高C#编程水平的50个要点 之十五“使用 using 和 try-finally 来处理资源的释放”
- as和()强制类型转换的区别
- as和强制类型转换的区别
- 提高C#编程水平的50个要点 之八“在值类型中,确保0是一个合法的数据”
- C# 提高C#编程水平的50个要点
- 强制类型转换和as运算符的区别
- 二叉树
- 杂记4
- 3、文件相关命令
- java.lang.NoSuchFieldError: VERSION_2_3_0 报错解决方案
- Linux command note
- 提高C#编程水平的50个要点 之三“在 as 和 强制类型转换之间,优先使用 as 操作符”。
- 1118. Birds in Forest (25) PAT 甲级
- 20位活跃在Github上的国内技术大牛
- 递归神经网络(RNN)
- mysql 主从复制
- AVL树(三)之 Java的实现【转】
- AJAX与跨域请求CORS(JS)
- phonegap打包
- Ubuntu系统环境搭建