2010-06-16 38 views
84

Soy un experimentado programador de 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.Diferencia entre DirectCast() y CType() en VB.NET

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

+6

Duplicado exacto de esto * Casting DataTypes con DirectCast, CType, TryCast * http://stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast – MarkJ

+1

Posible duplicado de [Casting DataTypes with DirectCast, CType, TryCast] (https: // stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast) – Imad

Respuesta

151

Lo primero a tener en cuenta es que VB.NET no tiene un análogo directo al mecanismo de fundición (type)instance de C#. 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 fundición C#. Solo le permite emitir cuando el elemento que se va a emitir ya es del tipo al que está enviando. 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 de objeto subyacente IEnumerable es realmente 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 hace que sea 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 fundición 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 al Convert.To___() en C#, donde el ___ es el tipo de destino de tu conversión. Esto es deseable porque es muy potente, 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.

Por lo general, debe preferir DirectCast() cuando pueda.

Finalmente, faltó un operador de fundición: TryCast(), que es un operador análogo directo al de C# as.

+17

+1 Diría que el rigor de 'DirectCast' es otra ventaja. Si comete un error, el compilador se lo comunica de inmediato, pero con 'CType' un error puede ocasionar un comportamiento incorrecto ocasional en el tiempo de ejecución, tal vez en alguna máquina de usuario con diferentes configuraciones regionales. – MarkJ

+0

Gran respuesta. Entonces, en orden de complejidad (de pequeño a grande): 'DirectCast',' TryCast', 'CType' /' Convert.ToXYZ() ',' C () '¿sería correcto? – motto

+2

@motto - cerrar. Las "funciones" C () deben moverse más arriba en la lista, ya que realmente son operadores en lugar de funciones, aunque tienen una semántica de funciones. Para los tipos que los tienen, están muy cerca del lanzamiento de C# (tipo), pero harán un poco más de trabajo. –

10

Con CType puede escribir algo como esto Ctype("string",Integer). Pero con DirectCast la declaración anterior daría error de tiempo de compilación.

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

DirectCast es mucho más restrictivo que CType. Por ejemplo,

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

genera un error. se muestra en el estudio visual IDE también. Pero

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

¿Eso no genera un error.