2010-04-24 23 views
39

Desde que me mudé de VB6 a VB.NET en algún lugar en 2005, he estado usando CType para hacer casting de un tipo de datos a otro. Lo hago porque simplemente es más rápido escribir, solía existir en VB6 y no sé por qué tengo que usar DirectCast si aparentemente no hay diferencia entre ellos.Casting DataTypes con DirectCast, CType, TryCast

Utilizo TryCast de vez en cuando porque entiendo que a veces el lanzamiento puede fallar. Sin embargo, no puedo obtener la diferencia entre CType y DirectCast.

¿Alguien me puede decir la diferencia en inglés simple y llano cuál es la diferencia entre los dos (CType y DirectCast)? Agregar ejemplos de dónde usar lo que sería útil sería útil.

Gracias.

+0

posible duplicado de [Diferencia entre DirectCast() y CType() en VB.Net] (http://stackoverflow.com/questions/3056514/difference-between-directcast-and-ctype-in -vb-net) – RMalke

+4

@RMalke: Mi pregunta fue hecha antes de la [pregunta 'duplicada'] vinculada (http://stackoverflow.com/q/3056514). Esto es corroborado por [comentario de MarkJ] (http://stackoverflow.com/posts/comments/3138442). Además, la respuesta aceptada aquí explica 'CType' fundición en detalle, algo que la respuesta aceptada en la otra pregunta realmente no entra. En todo caso, creo que es el otro que debe cerrarse o vincularse de otro modo a esto. –

Respuesta

51

TryCast y DirectCast son operadores de conversión que se asignan directamente al soporte de CLR para el casting. Pueden convertir rápidamente un objeto de un tipo base en un tipo derivado o unbox un valor de un tipo de valor. DirectCast arroja una excepción cuando el lanzamiento no es posible, TryCast devuelve Nothing si falla. Por lo general, desea favorecer a DirectCast para detectar errores de programación.

CType permite un superconjunto de conversiones, que CLR no ve con buenos ojos. El mejor ejemplo en el que puedo pensar es convertir una cadena en un número o fecha. Por ejemplo:

Dim obj As Object 
obj = "4/1/2010" 
Dim dt As DateTime = CType(obj, DateTime) 

¿Qué vas a tener que usar si Option Strict On está en vigor. Si está apagado, entonces puede hacerlo directamente:

Option Strict Off 
... 
    Dim dt As DateTime = obj 

Muy conveniente y, por supuesto, parte del legado de VB.NET como un lenguaje de tipos dinámicos. Pero no sin problemas, esa fecha es el día de Unicorn en stackoverflow.com, pero será un día de enero cuando un británico entre en la cadena. Las conversiones inesperadas son la razón por la que CLR no permite estas directamente. El explícita, nunca una conversión sorpresa se ve así:

Dim dt As DateTime = DateTime.Parse(obj.ToString(), _ 
    System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat) 

si debe comprar en Try/DirectCast vs CType vs conversiones explícitas es más bien una elección personal. Si ahora programa con Option Strict On entonces definitivamente debería comenzar a usar Try/DirectCast. Si prefiere el lenguaje VB.NET porque le gusta la conveniencia de la escritura dinámica, no dude en permanecer en CType.

15

DirectCast es el doble de rápido para los tipos de valores (enteros ... etc.), pero idénticos para los tipos de referencia.

Para obtener más información, consulte la sección "Funciones de conversión, CType, DirectCast y System.Convert" en this página MSDN.

+0

El enlace que brindó contiene muy buena documentación. Muchas gracias. –

1

Esto page lo explica bien.

Al leerlo, creo que cuando usa DirectCast, está seguro de que la conversión funcionará sin estrechamiento ni expansión (en este caso, datos numéricos). Mientras que, CType intentará convertirlo, con el desarrollador consciente de estrechamiento/expansión.

+3

Es ese tipo de tiempo de ejecución y de tipo especificado que no entiendo. Si declaro un doble, espero que la conversión explícita a un número entero funcione. ¿Cómo es que CType puede hacerlo perfectamente y DirectCast no? ¿Me falta algo aquí? Inglés simple por favor ... –

0

Por "conversión" se entiende la conversión de un tipo de datos a otro (por ejemplo, cadena a entero, decimal a entero, objeto a cadena, etc.).

Por "cast" se entiende el cambio de un tipo de objeto a otro tipo que es relacionado con él por una de las siguientes reglas.

http://www.thedevheaven.com/2012/09/directcast-vs-ctype.html