我是一位经验丰富的C / C ++ / C#程序员,刚接触VB.NET。我通常使用CType(以及CInt,CBool,CStr)进行转换,因为它减少了字符,是我接触过的第一种转换方法,但是我也知道DirectCast和TryCast。
简而言之,DirectCast和CType之间是否有任何区别(转换效果,性能等)?我了解TryCast的想法。
我是一位经验丰富的C / C ++ / C#程序员,刚接触VB.NET。我通常使用CType(以及CInt,CBool,CStr)进行转换,因为它减少了字符,是我接触过的第一种转换方法,但是我也知道DirectCast和TryCast。
简而言之,DirectCast和CType之间是否有任何区别(转换效果,性能等)?我了解TryCast的想法。
Answers:
首先要注意的是VB.NET与C#的(type)instance
转换机制没有直接的相似之处。之所以提出这一点,是因为在比较两个VB.NET运算符(它们是运算符,而不是函数,即使它们具有函数语义)时,它作为起点很有用。
DirectCast()
比C#转换运算符更严格。仅当已投射的物品是您要投射的类型时,才允许您投射。我相信它将仍然取消值类型的装箱,但是否则它将不会进行任何转换。因此,例如,您不能像使用C#强制转换那样从转换short
为。但是,如果基础对象变量确实是一个,则可以从转换为数组。当然,可以假定对象实例的类型确实位于继承树中的转换类型之下,您可以从任意类型转换为任何类型。int
(int)
IEnumerable
IEnumerable
Array
Object
这是理想的,因为它要快得多。几乎不需要进行转换和类型检查。
CType()
不如C#转换运算符严格。使用简单的(int)
样式转换,它将完成您无法做到的事情,例如将字符串转换为整数。它具有与Convert.To___()
C#调用一样强大的功能,其中C ___
是您的类型转换的目标类型。
这是理想的,因为它非常强大。但是,这种能力是以性能为代价的。它不如DirectCast()
C#的强制转换运算符快,因为它可能需要做很多工作才能完成强制转换。通常,您应该尽可能选择更喜欢的DirectCast()
方式。
最后,您错过了一个强制转换运算符:TryCast()
,它直接类似于C#的as
运算符。
DirectCast
是另一个优势。如果您输入错误,编译器会立即告诉您,但是CType
如果输入错误,可能会在运行时偶尔引起错误的行为-可能是在某些具有不同区域设置的用户机器上。
DirectCast
/ ,会是正确的吗?TryCast
CType
Convert.ToXYZ()
C<xyz>()
DirectCast
仅对类严格,对接口不严格(因为您可以拥有COM类型-也许还有其他类型-实际上实现了.NET Type .GetInterfaces
列表未定义的接口)。
TryCast()
和as
并不完全相同。TryCast()
仅适用于引用类型,而as
适用于任何可以为null的内容。因此int? icast = myNum as int?;
可以正常工作,但Dim icast as Integer? = TryCast(myNum, Integer?)
会产生编译器错误。两种语言之间只有一个独特的区别。大声笑
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