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

VB.NET中DirectCast()和CType()的区别,vb.net,ctype,directcast,Vb.net,Ctype,Directcast,我是一名经验丰富的C/C++/C程序员,刚刚进入VB.NET。我通常使用CType(以及CInt、CBool、CStr)进行强制转换,因为它的字符数较少,是我接触到的第一种强制转换方式,但我也知道DirectCast和TryCast 简单地说,DirectCast和CType之间是否存在任何差异(强制转换的效果、性能等)?我理解TryCast的想法。首先要注意的是,VB.NET没有直接模拟C#的(type)实例转换机制。我之所以提出这一点,是因为它可以作为比较两个VB.NET操作符(它们是操作符

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


简单地说,DirectCast和CType之间是否存在任何差异(强制转换的效果、性能等)?我理解TryCast的想法。

首先要注意的是,VB.NET没有直接模拟C#的
(type)实例
转换机制。我之所以提出这一点,是因为它可以作为比较两个VB.NET操作符(它们是操作符,而不是函数,尽管它们具有函数语义)的起点和常用参考

DirectCast()
比C#casting操作符更严格。它仅允许您在正在转换的项目已经是您要转换的类型时进行转换。我相信它仍然会取消装箱值类型,但否则它不会进行任何转换。因此,例如,您不能从
short
转换为
int
,就像您可以使用C#
(int)
转换一样。但是,如果底层的
IEnumerable
对象变量实际上是一个
数组,则可以从
IEnumerable
转换为数组。当然,您可以从
对象
强制转换为任何对象,前提是您的对象实例的类型确实在继承树中的强制转换类型之下

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

CType()
比C#casting操作符的要求要低。它可以做一些简单的
(int)
样式转换无法完成的事情,比如将字符串转换为整数。它的功能与在C#中调用
Convert.To
一样强大,其中
__;
是您强制转换的目标类型

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


最后,您错过了一个强制转换操作符:
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
Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
它也将显示在VisualStudioIDE中

但是,这不会引发错误:

Sub Main()
    Dim newint As Integer = DirectCast(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

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