本人很喜欢VB.NET DirectCast运算符,在工作中也很喜欢总结关于VB.NET DirectCast运算符的经验教训,下面就这个问题来详细说说吧。VB.NET 能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#同属.NET的语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢。我们一起来探究一下VB.NET DirectCast运算符。
在Visual Basic 2005中将加入一个新的运算符——TryCast,相当于C#的as运算符。我一直希望VB有这样一个运算符。VB目前的类型转换运算符主要有 CType和DirectCast。他们的用法几乎一样。我详细比较了一下这两个运算符,得出以下结论:
1、在转换成引用类型时,两者没有什么区别,都是直接调用castclass指令,除非重载了类型转换运算符CType。VB.NET DirectCast运算符是不能重载的。
2、转换成值类型时,CType会调用VB指定的类型转换函数(如果有的话),比如将String转换为Int32时,就会自动调用 VisualBasic.CompilerServices.IntegerType.FromString,而将Object转换为Int32则会调用 FromObject。其他数值类型转换为Int32时,CType也会调用类型本身的转换方法实施转换。VB.NET DirectCast运算符则很简单,直接将对象拆箱成所需类型。
所以在用于值类型时,CType没有DirectCast快速但可以支持更多的转换。在C#中,类型转换则为(type)运算符和as运算符。(type)运算符的工作方式与VB的DirectCast很相似,也是直接拆箱或castclass的,但是如果遇到支持的类型转换(如long到 int),(type)运算符也会调用相应的转换方法,但不支持从String到int的转换。C#另一个运算符as则更加智能,它只要判断对象的运行实例能否转成目标类型,然后就可以省略castclass指令,直接按已知类型进行操作,而且编译器还可以自动对as进行优化,比如节省一个对象引用等。所以在将Object转换成所需的类型时,as是最佳选择。
由于as有很多优点,Visual Basic 2005将这一特性吸收了过来,用TryCast运算符就可以获得和as一样的效果,而且语法与VB.NET DirectCast运算符或CType一样。
【编辑推荐】