Conversiones de tipo de datos y conversión en VB.NET

click fraud protection

El casting es el proceso de convertir un tipo de datos a otro, por ejemplo, de un tipo entero a un tipo de cadena. Algunas operaciones en VB.NET requieren tipos de datos específicos para funcionar. La fundición crea el tipo que necesita. El primer artículo de esta serie de dos partes, Conversión de conversiones y tipo de datos en VB.NET, introduce la conversión. Este artículo describe los tres operadores que puede usar para emitir VB.NET - DirectCast, CType y TryCast, y compara su rendimiento.

El rendimiento es una de las grandes diferencias entre los tres operadores de casting según Microsoft y otros artículos. Por ejemplo, Microsoft suele tener cuidado al advertir que "DirectCast... puede proporcionar un rendimiento algo mejor que CType al convertir ay desde el tipo de datos Objeto." (Énfasis añadido.)

Decidí escribir un código para verificar.

Pero primero una palabra de precaución. Dan Appleman, uno de los fundadores de la editorial de libros técnicos Apress y un técnico confiable gurú, una vez me dijo que el rendimiento de la evaluación comparativa es mucho más difícil de hacer correctamente que la mayoría de las personas darse cuenta de. Hay factores como el rendimiento de la máquina, otros procesos que pueden ejecutarse en paralelo, la optimización como el almacenamiento en caché de memoria o la optimización del compilador, y errores en sus suposiciones acerca de qué es realmente el código haciendo. En estos puntos de referencia, he tratado de eliminar los errores de comparación de "manzanas y naranjas" y todas las pruebas se han ejecutado con la versión de lanzamiento. Pero aún puede haber errores en estos resultados. Si nota alguno, hágamelo saber.

instagram viewer

Los tres operadores de casting son:

  • DirectCast
  • CType
  • TryCast

De hecho, generalmente encontrará que los requisitos de su aplicación determinarán qué operador utilizará. DirectCast y TryCast tienen requisitos muy limitados. Cuando usa DirectCast, el tipo ya debe ser conocido. Aunque el código ...

theString = DirectCast (theObject, String)

... se compilará correctamente si el objeto no es una cadena ya, entonces el código arrojará una excepción de tiempo de ejecución.

TryCast es aún más restrictivo porque no funcionará en absoluto en tipos de "valor" como Integer. (La cadena es un tipo de referencia. Para obtener más información sobre los tipos de valores y los tipos de referencia, consulte el primer artículo de esta serie.) Este código ...

theInteger = TryCast (theObject, Integer)

... Ni siquiera se compilará.

TryCast es útil cuando no está seguro con qué tipo de objeto está trabajando. En lugar de arrojar un error como DirectCast, TryCast simplemente devuelve Nothing. La práctica normal es probar Nada después de ejecutar TryCast.

Solo CType (y los otros operadores "Convertir" como CInt y CBool) convertirán los tipos que no tienen una relación de herencia, como un Entero en una Cadena:

Dim theString As String = "1" Dim theInteger as Integer. theInteger = CType (theString, Integer)

Esto funciona porque CType utiliza "funciones auxiliares" que no forman parte de .NET CLR (Common Language Runtime) para realizar estas conversiones.

Pero recuerde que CType también arrojará una excepción si theString no contiene algo que se pueda convertir en un número entero. Si existe la posibilidad de que la cadena no sea un número entero como este ...


Dim theString As String = "George"

... entonces ningún operador de fundición funcionará. Incluso TryCast no funcionará con Integer porque es un tipo de valor. En un caso como este, tendría que usar la verificación de validez, como el operador TypeOf, para verificar sus datos antes de intentar emitirlos.

La documentación de Microsoft para DirectCast menciona específicamente la transmisión con un tipo de objeto, así que eso es lo que usé en mi primera prueba de rendimiento. ¡Las pruebas comienzan en la página siguiente!

DirectCast generalmente usará un tipo de objeto, así que eso es lo que usé en mi primera prueba de rendimiento. Para incluir TryCast en la prueba, también incluí un bloque If ya que casi todos los programas que usan TryCast tendrán uno. En este caso, sin embargo, nunca se ejecutará.

Aquí está el código que compara los tres cuando se convierte un objeto en una cadena:

Dim theTime As New Stopwatch () Dim theString As String. Dim theObject As Object = "An Object" Dim theIterations As Integer = CInt (iteraciones. Texto) * 1000000. ' 'Prueba de DirectCast. el tiempo. Comienzo() Para i = 0 a las iteraciones. theString = DirectCast (theObject, String) Próximo. el tiempo. Detener() DirectCastTime. Texto = el tiempo. Milisegundos transcurridos. Encadenar. ' 'Prueba CType. el tiempo. Reiniciar() Para i como entero = 0 a las iteraciones. theString = CType (theObject, String) Próximo. el tiempo. Detener() CTypeTime. Texto = el tiempo. Milisegundos transcurridos. Encadenar. ' Prueba TryCast. el tiempo. Reiniciar() Para i como entero = 0 a las iteraciones. theString = TryCast (theObject, String) Si la cadena no es nada entonces. MsgBox ("Esto nunca debería mostrarse") Terminara si. Próximo. el tiempo. Detener() TryCastTime. Texto = el tiempo. Milisegundos transcurridos. Encadenar.

Esta prueba inicial parece mostrar que Microsoft está justo en el blanco. Aquí está el resultado. (Los experimentos con un número cada vez mayor de iteraciones, así como pruebas repetidas en diferentes condiciones, no mostraron diferencias significativas con respecto a este resultado).


Haga clic aquí para mostrar la ilustración.

DirectCast y TryCast fueron similares a 323 y 356 milisegundos, pero CType tomó más del triple de tiempo a 1018 milisegundos. Al emitir tipos de referencia como este, paga por la flexibilidad de CType en el rendimiento.

Pero, ¿siempre funciona de esta manera? El ejemplo de Microsoft en su página para DirectCast es principalmente útil para decirle qué no lo hará trabajar usando DirectCast, no lo que será. Aquí está el ejemplo de Microsoft:

Dim q As Object = 2.37. Dim i As Integer = CType (q, Integer) 'La siguiente conversión falla en tiempo de ejecución. Dim j As Integer = DirectCast (q, Integer) Dim f como nuevo sistema. Windows Formas Formar. Dim c As System. Windows Formas Controlar. 'La siguiente conversión tiene éxito. c = DirectCast (f, Sistema. Windows Formas Controlar)

En otras palabras, usted hipocresía use DirectCast (o TryCast, aunque no lo mencionen aquí) para convertir un tipo de objeto en un tipo entero, pero usted lata use DirectCast para convertir un tipo de formulario en un tipo de control.

Veamos el rendimiento del ejemplo de Microsoft de qué será trabajar con DirectCast. Usando la misma plantilla de código que se muestra arriba, sustituya ...


c = DirectCast (f, Sistema. Windows Formas Controlar)

... en el código junto con sustituciones similares para CType y TryCast. Los resultados son un poco sorprendentes.


Haga clic aquí para mostrar la ilustración.

DirectCast fue en realidad la más lenta de las tres opciones con 145 milisegundos. CType es solo un poco más rápido a 127 milisegundos, pero TryCast, incluido un bloque If, ​​es el más rápido a 77 milisegundos. También intenté escribir mis propios objetos:


Clase ParentClass... Fin de clase. Clase ChildClass. Hereda ParentClass... Fin de clase. 

Obtuve resultados similares. Parece que si eres no lanzando un tipo de objeto, estás mejor no usando DirectCast.

instagram story viewer