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
不会引发错误。