65.9K
CodeProject 正在变化。 阅读更多。
Home

DirectCast 与 CType

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.30/5 (28投票s)

2007年4月8日

CPOL

2分钟阅读

viewsIcon

218569

何时使用 DirectCast 与 CType。

引言

何时应该使用CType,何时应该使用DirectCast,哪个性能更好?简短的答案是:对于值类型(整数等),DirectCast 的速度是CType的两倍,但对于引用类型则相同。

背景

首先要理解的是,CTypeDirectCast 不是一回事。只有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

DirectCastCType 的共同点是它们都能够根据继承或实现将对象转换为新的类型。例如,如果你有一个字符串,但它存储在一个类型为Object的变量中,你可以使用DirectCastCType 将该变量视为类型为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

因此,假设你正在进行基于继承或实现的转换,你可以选择:DirectCastCType。哪个更好?

答案

DirectCast。根据 .NET 文档:DirectCast 不使用 Visual Basic 运行时帮助程序例程进行转换,因此它可以提供比CType略好的性能。

包含的项目对每种情况运行性能测试:值类型和引用类型的DirectCastCType。记住,引用类型是指诸如窗体、控件、字符串和自定义类之类的类型,而值类型是指诸如整数、双精度数和自定义结构之类的类型。以下是结果;数字是以毫秒为单位的 100 万次迭代。

引用类型的DirectCast

8.7885

引用类型的CType

11.718

值类型的DirectCast

18.5535

值类型的CType

39.06

结论:DirectCast 的性能几乎是CType的两倍。DirectCast 的性能也优于CType,尽管对于引用类型的优势要小得多。

注意:后续测试产生了非常相似的结果;你可以自己尝试。

使用DirectCast 的另一个原因是它不是 VB.NET 特有的,因此更易于移植到其他语言。因此,C# 和其他程序员在遇到DirectCast 时可能会更容易阅读他们的代码。

© . All rights reserved.