110

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

简单地说,DirectCast 和 CType 之间有什么区别(演员、性能等)吗?我理解 TryCast 的想法。

4

3 回答 3

192

首先要注意的是 VB.NET 没有直接模拟 C# 的(type)instance强制转换机制。我提出这个是因为它在比较两个 VB.NET 运算符(它们是运算符,而不是函数,即使它们具有函数语义)时作为起点和共同参考很有用。

DirectCast()比 C# 强制转换运算符更严格。它仅允许您在正在施放的项目已经是您要施放的类型时施放。我相信它仍然会取消装箱值类型,但否则它不会进行任何转换。因此,例如,您不能像使用 C#强制转换那样强制转换 from shortto 。但是,如果您的底层对象变量确实是一个. 当然,您可以从任何东西进行转换,假设您的对象实例的类型确实低于继承树中的转换类型。int(int)IEnumerableIEnumerableArrayObject

这是可取的,因为它更快。需要进行的转换和类型检查更少。

CType()没有 C# 强制转换运算符那么严格。它会做一些你不能用简单的(int)风格转换做的事情,比如将字符串转换为整数。Convert.To___()它与在 C#中调用一样强大,其中___是您的演员表的目标类型。

这是可取的,因为它非常强大。然而,这种能力是以性能为代价的。它不如DirectCast()C# 的演员表操作符快,因为它可能需要做很多工作才能完成演员表。通常,您应该尽可能选择DirectCast()

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

于 2010-06-16T19:37:06.773 回答
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
于 2011-07-05T14:50:58.197 回答
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
于 2016-09-11T06:22:35.117 回答