DirectCast 与 CType






4.30/5 (28投票s)
何时使用 DirectCast 与 CType。
引言
何时应该使用CType
,何时应该使用DirectCast
,哪个性能更好?简短的答案是:对于值类型(整数等),DirectCast
的速度是CType
的两倍,但对于引用类型则相同。
背景
首先要理解的是,CType
和 DirectCast
不是一回事。只有CType
可以将底层对象转换为不同类型对象的新的实例。例如,你想将一个整数转换为字符串。由于整数不继承字符串,因此必须创建一个String
对象的新的实例来存储该数字作为字符串。CType
可以做到这一点,DirectCast
则不能。注意:还有其他方法可以做到这一点,例如Convert.ToString
方法或CStr()
。
Dim MyInt As Integer = 123
Dim MyString1 As String = CType(MyInt, String)
Dim MyString2 As String = DirectCast(MyInt, String) ' This will not work
DirectCast
和 CType
的共同点是它们都能够根据继承或实现将对象转换为新的类型。例如,如果你有一个字符串,但它存储在一个类型为Object
的变量中,你可以使用DirectCast
或 CType
将该变量视为类型为String
的对象,因为类型String
继承自类型Object
。在这种情况下,内存中的底层数据实际上并没有改变,也没有对该数据进行任何处理。
Dim MyObject As Object = "Hello World"
Dim MyString1 As String = CType(MyObject, String)
Dim MyString2 As String = DirectCast(MyObject, String) ' This will work
危险:在使用DirectCast
之前,你**必须**知道你正在处理什么类型。如果你有一个类型为Object
的变量,并且你使用DirectCast
将其视为String
,你最好确保该变量实际上包含一个String
(或Nothing
)。如果一个整数以某种方式进入了该变量,则会抛出异常。
一种在代码中检查DirectCast
是否可行的方法是使用TypeOf
运算符。
If TypeOf MyObject Is String Then
因此,假设你正在进行基于继承或实现的转换,你可以选择:DirectCast
与 CType
。哪个更好?
答案
DirectCast
。根据 .NET 文档:DirectCast
不使用 Visual Basic 运行时帮助程序例程进行转换,因此它可以提供比CType
略好的性能。
包含的项目对每种情况运行性能测试:值类型和引用类型的DirectCast
与 CType
。记住,引用类型是指诸如窗体、控件、字符串和自定义类之类的类型,而值类型是指诸如整数、双精度数和自定义结构之类的类型。以下是结果;数字是以毫秒为单位的 100 万次迭代。
引用类型的DirectCast
8.7885
引用类型的CType
11.718
值类型的DirectCast
18.5535
值类型的CType
39.06
结论:DirectCast
的性能几乎是CType
的两倍。DirectCast
的性能也优于CType
,尽管对于引用类型的优势要小得多。
注意:后续测试产生了非常相似的结果;你可以自己尝试。
使用DirectCast
的另一个原因是它不是 VB.NET 特有的,因此更易于移植到其他语言。因此,C# 和其他程序员在遇到DirectCast
时可能会更容易阅读他们的代码。