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

Posted

技术标签:

【中文标题】VB.NET 中 DirectCast() 和 CType() 的区别【英文标题】:Difference between DirectCast() and CType() in VB.NET 【发布时间】:2011-03-04 15:30:29 【问题描述】:

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

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

【问题讨论】:

这个Casting DataTypes with DirectCast, CType, TryCast的完全复制 ***.com/questions/2703585/… Casting DataTypes with DirectCast, CType, TryCast的可能重复 【参考方案1】:

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

DirectCast() 比 C# 强制转换运算符更严格。它只允许您在被施放的项目已经是您要施放的类型时施放。我相信它仍然会取消装箱值类型,但否则它不会进行任何转换。因此,例如,您不能从 short 转换为 int,就像使用 C# (int) 转换一样。但是,如果您的底层IEnumerable 对象变量确实是Array,您可以从IEnumerable 转换为数组。当然,您可以从 Object 转换为任何内容,前提是您的对象实例的类型确实低于继承树中您的转换类型。

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

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

这是可取的,因为它非常强大。然而,这种能力是以性能为代价的。它不如DirectCast() 或C# 的演员表操作符快,因为它可能需要做很多工作才能完成演员表。一般来说,如果可以,你应该更喜欢DirectCast()

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

【讨论】:

+1 我想说DirectCast 的严格性是另一个优势。如果您犯了错误,编译器会立即告诉您,但使用 CType 时,错误可能会导致运行时偶尔出现错误行为 - 可能在某些具有不同区域设置的用户机器上。 很好的答案。所以按照复杂度(从小到大)的顺序:DirectCastTryCastCType/Convert.ToXYZ()C<xyz>() 是否正确? @motto - 关闭。 C() “函数”应该在列表上移到更高的位置,因为它们实际上是运算符而不是函数,即使它们具有函数语义。对于那些拥有它们的类型,它们非常接近 C# 的(类型)转换,但会做更多的工作。 @MarkJ +1 供您发表评论,但请注意 DirectCast 仅对类严格,而不是接口(因为您可以拥有 COM 类型——也许还有其他类型——实际上实现了未定义的接口.NET 类型的 .GetInterfaces 列表)。 @JoelCoehoorn +1,但实际上,TryCast()as 并不完全相同。 TryCast() 仅适用于引用类型,而 as 适用于任何可以为空的内容。所以int? icast = myNum as int?; 可以正常工作,但Dim icast as Integer? = TryCast(myNum, Integer?) 会给出编译器错误。这两种语言之间还有一个特殊的区别。大声笑【参考方案2】:

使用CType,您可以编写类似Ctype("string",Integer) 的内容。但是对于DirectCast,上面的语句会产生编译时错误。

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

【讨论】:

【参考方案3】:

DirectCastCType 更严格。

例如,这会抛出一个错误:

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

【讨论】:

以上是关于VB.NET 中 DirectCast() 和 CType() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

WPF 从 vb.net 代码开始动画给出错误

多个控件的事件处理程序 vb.net

VB.Net和C#.Net有啥差异?优缺点是啥?

vb c c++,c# vb.net到底啥区别

C#/VB.NET:在 Word 中设置文本对齐方式

VB.net 和C#.net 各有啥优缺点