Diferencia entre DirectCast () y CType () en VB.NET

Soy un progtwigdor con experiencia en C / C ++ / C # que acaba de ingresar a VB.NET. Generalmente utilizo CType (y CInt, CBool, CStr) para los moldes porque tiene menos caracteres y fue la primera forma de fundición a la que fui expuesto, pero también conozco DirectCast y TryCast.

Simplemente, ¿hay alguna diferencia (efecto de reparto, rendimiento, etc.) entre DirectCast y CType? Entiendo la idea de TryCast.

Lo primero a tener en cuenta es que VB.NET no tiene un mecanismo de conversión de (type)instance análogo directo al de C # (type)instance . Lo menciono porque es útil utilizarlo como punto de partida para comparar los dos operadores de VB.NET (y son operadores, no funciones, aunque tengan semántica de funciones).

DirectCast() es más estricto que el operador de colada C #. Solo te permite lanzar cuando el elemento que se está lanzando ya es del tipo al que estás lanzando. No hará ninguna conversión. Por lo tanto, por ejemplo, no puede convertir de corto a int, como podría hacerlo con un elenco de C # (int) . Pero puede convertir desde un IEnumerable a una matriz, si su variable subyacente de objeto IEnumerable realmente es una Array . Y, por supuesto, puede convertir desde Object a cualquier cosa, suponiendo que el tipo de su instancia de objeto está realmente en algún lugar debajo de su tipo de conversión en el árbol de herencia.

Esto es deseable porque eso lo hace más rápido . Hay un poco menos de conversión y verificación de tipos que debe llevarse a cabo.

CType() es menos estricto que el operador de colada C #. Hará cosas como convertir una cadena en un entero que no se puede hacer simplemente con un molde (int) . Tiene tanto poder como llamar a Convert.To___() en C #, donde el ___ es el tipo de objective de tu elenco. Esto es deseable porque es muy poderoso, pero esa potencia se consigue a costa del rendimiento: no es tan rápido como DirectCast () o el operador de casting de C # porque puede que haya mucho trabajo por hacer para terminar el reparto.

En general, debería preferir DirectCast() cuando pueda.

Finalmente, TryCast() un operador de casting: TryCast() , que es un análogo directo a C # as operador.

Con CType puedes escribir algo como este Ctype("string",Integer) . Pero con DirectCast la statement anterior daría error de tiempo de comstackción.

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

DirectCast es más restrictivo que CType .

Por ejemplo, esto lanzará un error:

 Sub Main() Dim newint As Integer = DirectCast(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub 

También se mostrará en el IDE de Visual Studio.

Sin embargo, esto no arroja un error:

 Sub Main() Dim newint As Integer = CType(3345.34, Integer) Console.WriteLine(newint) Console.ReadLine() End Sub 
Intereting Posts