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
时,错误可能会导致运行时偶尔出现错误行为 - 可能在某些具有不同区域设置的用户机器上。
很好的答案。所以按照复杂度(从小到大)的顺序:DirectCast
、TryCast
、CType
/Convert.ToXYZ()
、C<xyz>()
是否正确?
@motto - 关闭。 CDirectCast
仅对类严格,而不是接口(因为您可以拥有 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】: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
【讨论】:
以上是关于VB.NET 中 DirectCast() 和 CType() 的区别的主要内容,如果未能解决你的问题,请参考以下文章