VB.NET中DirectCast()和CType()之间的区别

我是刚刚进​​入VB.NET的经验丰富的C / C ++ / C#程序员。 我通常使用CType(和CInt,CBool​​,CStr)进行强制转换,因为它的字符less,并且是我接触到的第一种投射方式,但是我也知道DirectCast和TryCast。

简单来说,DirectCast和CType之间有什么区别(效果演员,性能等)? 我了解TryCast的想法。

首先要注意的是,VB.NET没有直接模拟C#的(type)instance投射机制。 我把它提出来是因为使用它作为比较两个VB.NET运算符(它们是运算符而不是函数,即使它们具有函数语义)的起点是有用的。

DirectCast()比C#转换运算符更为严格。 它只允许你在被投射的物品已经投射到的types时进行投射。 它不会做任何转换。 所以,例如,你不能从short转换为int,就像用C# (int) 。 但是,如果您的底层IEnumerable对象variables确实是一个Array ,您可以从IEnumerable转换为数组。 当然,你也可以从Object强制转换为任何东西,假设你的对象实例的types实际上是在inheritance树中的转换types之下的某个地方。

这是可取的,因为这使得它更快 。 有一点less转换和types检查需要发生。

CType()不如C#铸造操作符那么严格。 它会做一些事情,比如把一个string转换成一个你不能用简单的(int)强制转换的整数。 它具有与在C#中调用Convert.To___()一样多的function,其中___是您的转换的目标types。 这是可取的,因为它是非常强大的,但是这个能力是以牺牲性能为代价的 – 它不如DirectCast()或者C#的投射运算符那么快,因为完成投射可能有相当多的工作要做。

一般来说,你应该更喜欢DirectCast()

最后,你错过了一个cast操作符: TryCast() ,它是C#操作符的直接模拟。

CType你可以写一些像这样的Ctype("string",Integer) 。 但与DirectCast上述语句会给编译时间错误。

  Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error Dim b As Integer = CType("1", Integer) 'Will compile 

DirectCast比CType有很多限制。 例如,

 Sub Main() Dim newint As Integer = DirectCast(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub 

抛出一个错误。 它也在Visual Studio IDE中显示。 但

  Sub Main() Dim newint As Integer = CType(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub 

不会引发错误。