我是一位经验丰富的C / C ++ / C#程序员,刚刚进入VB.NET。我通常使用CType(和CInt,CBool,CStr)进行演员表示,因为它是较少的字符,并且是我接触的第一种投射方式,但我也知道DirectCast和TryCast。
简单地说,DirectCast和CType之间是否有任何差异(演员,表演等的影响)?我理解TryCast的想法。
答案 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