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

时间:2010-06-16 19:27:53

标签: vb.net ctype directcast

我是一位经验丰富的C / C ++ / C#程序员,刚刚进入VB.NET。我通常使用CType(和CInt,CBool​​,CStr)进行演员表示,因为它是较少的字符,并且是我接触的第一种投射方式,但我也知道DirectCast和TryCast。

简单地说,DirectCast和CType之间是否有任何差异(演员,表演等的影响)?我理解TryCast的想法。

3 个答案:

答案 0 :(得分:175)

首先要注意的是VB.NET与C#的(type)instance转换机制没有直接的类比。我提出这个问题是因为将它作为比较两个VB.NET运算符的起点是有用的(它们是运算符,而不是函数,即使它们具有函数语义)。

DirectCast()比C#强制转换运算符更严格。它只允许您在投射的项目已经投射到的类型时施放。它不会进行任何转换。因此,例如,您不能像使用C#(int)强制转换那样从short转换为int。但是,如果基础IEnumerable对象变量确实是Array,则可以从IEnumerable转换为数组。当然,您可以从Object转换为任何东西,假设您的对象实例的类型确实位于继承树中的转换类型之下。

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

CType()不如C#强制转换运算符严格。它会执行一些操作,例如将字符串转换为整数,而不仅仅是使用简单的(int)强制转换。它具有与在C#中调用Convert.To___()一样多的能力,其中___是你的演员的目标类型。这是可取的,因为它非常强大,但是这种能力是以性能为代价的 - 它没有DirectCast()或C#的强制转换运算符那么快,因为完成演员可能还有很多工作要做。

一般情况下,您应该尽可能选择DirectCast()

最后,您错过了一个转换运算符:TryCast(),它直接类似于C#的as运算符。

答案 1 :(得分:10)

使用CType,您可以编写类似Ctype("string",Integer)的内容。但是使用DirectCast,上面的语句会给出编译时错误。

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile

答案 2 :(得分:0)

Human.prototype[[Prototype]]更具限制性。

例如,这会抛出错误:

Object.prototype

它也将在Visual Studio IDE中显示。

然而,这不会引发错误:

Object.prototype