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


99

我是一位经验丰富的C / C ++ / C#程序员,刚接触VB.NET。我通常使用CType(以及CInt,CBool​​,CStr)进行转换,因为它减少了字符,是我接触过的第一种转换方法,但是我也知道DirectCast和TryCast。

简而言之,DirectCast和CType之间是否有任何区别(转换效果,性能等)?我了解TryCast的想法。


6
确切的重复这一点与DirectCast,CTYPE,TryCast铸造数据类型 stackoverflow.com/questions/2703585/...
MarkJ

Answers:


182

首先要注意的是VB.NET与C#的(type)instance转换机制没有直接的相似之处。之所以提出这一点,是因为在比较两个VB.NET运算符(它们是运算符,而不是函数,即使它们具有函数语义)时,它作为起点很有用。

DirectCast()比C#转换运算符更严格。仅当投射的物品是您要投射的类型时,才允许您投射。我相信它将仍然取消值类型的装箱,但是否则它将不会进行任何转换。因此,例如,您不能像使用C#强制转换那样从转换short为。但是,如果基础对象变量确实是一个,则可以从转换为数组。当然,可以假定对象实例的类型确实位于继承树中的转换类型之下,您可以从任意类型转换为任何类型。int(int)IEnumerableIEnumerableArrayObject

这是理想的,因为它要快得多。几乎不需要进行转换和类型检查。

CType()不如C#转换运算符严格。使用简单的(int)样式转换,它将完成您无法做到的事情,例如将字符串转换为整数。它具有与Convert.To___()C#调用一样强大的功能,其中C ___是您的类型转换的目标类型。

这是理想的,因为它非常强大。但是,这种能力是以性能为代价的。它不如DirectCast()C#的强制转换运算符快,因为它可能需要做很多工作才能完成强制转换。通常,您应该尽可能选择更喜欢的DirectCast()方式。

最后,您错过了一个强制转换运算符:TryCast(),它直接类似于C#的as运算符。


23
+1我想说的严格DirectCast是另一个优势。如果您输入错误,编译器会立即告诉您,但是CType如果输入错误,可能会在运行时偶尔引起错误的行为-可能是在某些具有不同区域设置的用户机器上。
MarkJ 2010年

1
好答案。因此,在复杂的顺序(从小到大): ,,DirectCast / ,会是正确的吗?TryCastCTypeConvert.ToXYZ()C<xyz>()
座右铭

3
@座右铭-关闭。C <xyz>()“函数”应该在列表上移到更高位置,因为它们实际上是运算符而不是函数,即使它们具有函数语义。对于具有它们的那些类型,它们非常接近C#的(类型)广播,但是将做更多的工作。
Joel Coehoorn

3
@MarkJ +1表示您的评论,但注意DirectCast仅对类严格,对接口不严格(因为您可以拥有COM类型-也许还有其他类型-实际上实现了.NET Type .GetInterfaces列表未定义的接口)。
马克·赫德

2
@JoelCoehoorn +1,但是实际上TryCast()as并不完全相同。TryCast()仅适用于引用类型,而as适用于任何可以为null的内容。因此int? icast = myNum as int?;可以正常工作,但Dim icast as Integer? = TryCast(myNum, Integer?)会产生编译器错误。两种语言之间只有一个独特的区别。大声笑
CptRobby 2014年

12

随着CType你可以写这样的事情Ctype("string",Integer)。但是用DirectCast上面的语句会给出编译时错误。

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

0

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.