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

Cal*_*son 98 vb.net ctype directcast

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

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

Joe*_*orn 179

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

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

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

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

一般来说,你应该尽可能地选择DirectCast().

最后,你错过了一个转换操作符:TryCast()这是C#as操作符的直接模拟.

  • +1我会说'DirectCast'的严格性是另一个优势.如果你犯了一个错误,编译器会立即告诉你,但是`CType`一个错误可能会在运行时偶尔出现错误的行为 - 可能在某些具有不同区域设置的用户机器上. (23认同)
  • @MarkJ +1为你的评论,但注意`DirectCast`只对类而不是接口严格(因为你可以有COM类型 - 可能还有其他 - 实际上实现了.NET类型的`.GetInterfaces'未定义的接口列表). (3认同)
  • 很好的答案。那么按照复杂性的顺序(从小到大):`DirectCast`、`TryCast`、`CType`/`Convert.ToXYZ()`、`C<xyz>()` 是正确的吗? (2认同)
  • @motto - 关闭.C <xyz>()"函数"应该在列表中移动得更高,因为它们实际上是运算符而不是函数,即使它们具有函数语义.对于拥有它们的那些类型,它们非常接近C#(类​​型)转换,但是会做更多的工作. (2认同)
  • @JoelCoehoorn +1,但实际上,`TryCast()`和`as`并不完全相同.`TryCast()`仅适用于引用类型,而`as`适用于任何可以为null的东西.那么`int?icast = myNum as int?;`可以正常工作,但是`Dim icast as Integer?= TryCast(myNum,Integer?)`会给编译器错误.这两种语言之间只有一个特殊的区别.大声笑 (2认同)

小智 12

随着CType你可以写一些像这样的事情Ctype("string",Integer).但是DirectCast上面的语句会给编译时错误.

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile
Run Code Online (Sandbox Code Playgroud)