none
TryCast, DirectCast y CType RRS feed

  • Pregunta

  • buno enrealidad mi preguntaes muy sensilla... quisa muy torpe pero quiero quitarme esta duda

    que diferencia hay entre estas tres funciones antes mensionadas?

    cuando usar cada una de ellas?

    saludos!!

    de antemano gracias

    lunes, 1 de agosto de 2011 22:34

Respuestas

  • "Arthuro Zerda" preguntó:

    > que diferencia hay entre estas tres
    > funciones antes mensionadas?
    >
    > cuando usar cada una de ellas?

    Hola, Arturo:

    Se trata de tres operadores de conversión que se pueden utilizar en Visual Basic, entre otros cuantos más, para convertir datos de un tipo en otro tipo de dato diferente. Pero si bien los tres operadores se utilizan para convertir datos, cada uno tiene su característica particular que lo diferencia de los demás.

    Voy a explicar las diferencias entre uno y otro operador desde la perspectiva personal del que menos utilizo (TryCast) al que más utilizo (DirectCast).

    TryCast
    =======
    Es el más fácil de utilizar y el que menos problema da, porque nunca produce una excepción si no se puede convertir un tipo de dato a otro. Quizás sea éste el motivo por el que apareció con la versión 2005 de Visual Basic: para evitar que los desarrolladores inexpertos obtuvieran errores de conversión cuando utilizaban los operadores CType o DirectCast con las primeras versiones de Visual Basic .NET.

    Esto último, unido a que la mayoría de éstos usuarios tienen desactivada la instrucción Option Strict (cuestión que no recomiendo que se haga), hace que el operador TryCast sea el preferido entre usuarios que no se preocupan demasiado de escribir código a prueba de errores o excepciones de conversión.

    Pero ahora, en lugar de una excepción InvalidCastException obtienen un valor Nothing si la conversión no ha tenido éxito, que lo mismo el usuario inexperto no sabe muy bien lo que tiene que hacer con un valor Nothing. :-D

    El operador TryCast solamente se puede utilizar con tipos de datos por referencia, es decir, aquellos tipos de datos que sean clases o interfaces. Pero no se puede utilizar si se trata de un tipo de dato por valor (Integer, Double, Long, o cualquier tipo definido como una estructura). Es decir, la siguiente conversión no está permitida con el operador TryCast:

     Dim index As Integer = 45
     Dim d As Double = TryCast(index, Double) ' <-- No permitido
    


    No se puede utilizar el operador TryCast para convertir un valor cualquiera en Double, Integer, Long, Byte, Single o cualquier otro tipo de datos definidio como Structure.

    Nunca utilizo el operador TryCast en mi código fuente, quizás lo haya hecho en los ejemplos que publico en éste foro, porque prefiero capturar una excepción del tipo InvalidCastException antes de obtener un valor Nothing. Aparte que teniendo activada la instrucción Option Strict, y haciendo un buen uso de los operadores CType o DirectCast, es menos probable que se obtenga una excepción o un valor Nothing.

    CType
    =====
    Es el operador más versátil de los tres, porque se puede utilizar para realizar conversiones tanto con tipos de datos por referencia (clases e interfaces) como con tipos de datos por valor (estructuras, Integer, Long, Single, etc.). Por supuesto, si la conversión no se puede efectuar, en tiempo de ejecución se podría obtener una excepción OverflowException (error en una conversión de restricción entre tipos de datos integrales) o InvalidCastException (la conversión no se puede efectuar por ser indefinida), por lo que habría que encerrar la llamada al operador CType entre un bloque Try ... End Try para capturar dicha excepción.

    Con el operador CType, sí podemos convertir un valor Integer en Double:

     Dim index As Integer = 45
     Dim d As Double = CType(index, Double)
    


    De vez en cuando suelo utilizar el operador CType, y siempre que lo he hecho, ha sido para efectuar conversiones entre tipos de datos por valor o estructuras. Para las conversiones entre tipos de datos numéricos prefiero utilizar otros operadores de conversión que nos proporciona tanto el lenguaje Visual Basic (CDbl, CInt, CStr, etc.), como el propio marco de trabajo de .NET (Convert.ToString, Convert.ToDouble, Convert.ToInt32, etc.).

    DirectCast
    ==========
    Es mi operador de conversión preferido y el que suelo utilizar para efectuar conversiones entre tipos de datos por referencia (clases e interfaces). No está permitido utilizar el operador DirectCast con tipos de datos por valor (Integer, Long, Decimal, etc.).

     ' Referenciamos el objeto DataTable
     ' enlazado con el control DataGridView
     ' 
     Dim dt As DataTable = _
      DirectCast(DataGridView1.DataSource, DataTable)
    


    El motivo que prefiera DirectCast a CType es porque el primero proporciona un mayor rendimiento, ya que no hace uso de código auxiliar para llevar a efecto la conversión. No es que el tiempo que utiliza CType para realizar la conversión sea significativo, pero ¿para qué ejecutar más código del que sea estrictamente necesario? ;-)

    Ni que decir tiene que si la conversión no se puede efectuar con el operador DirectCast, se producirá una excepción del tipo InvalidCastException en tiempo de ejecución, por lo que se aconseja encerrar el código de llamada entre un bloque Try ... End Try.

    A diferencia del operador CType, el operador DirectCast no producirá una excepción OverflowException, ya que éste último operador no puede utilizarse para efectuar conversiones entre tipos de datos por valor (valores numéricos u otro tipo de dato definido como estructura):

     Dim index As Integer = 45
     Dim d As Double = DirectCast(index, Double) ' <-- No permitido
    


    DirectCast y TryCast trabajan de la misma manera para efectuar conversiones entre tipos de datos por referencia, pero mientras que DirectCast puede causar una excepción InvalidCastException en tiempo de ejecución, el operador TryCast devolverá un valor Nothing en lugar de lanzar una excepción.

    En fin, espero que la breve explicación te haya servido para despejar alguna que otra duda con los operadores de conversión. :-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    martes, 2 de agosto de 2011 7:47
    Moderador
  • hola

    revisa de este link

    http://msdn.microsoft.com/es-es/library/zyy863x8.aspx

    la tabla que lleva el titulo

    Palabras clave para conversiones

    alli veras la compracion entres estos 3 metodos, es mas tienes los links a cada uno

     

    igualmente la diferencia la noto con el TryCast, el cual es un casteo optimista, porque sino puede convertir nod a error sino que devuelve Nothing, lo cual lo hace ideal ante algunas situaciones en dodne necesitas convertir para luego validar si se pudo hacerlo

    en un evento podrias intentar castear a un conmtrol para ver si es de este tipo o no

    Dim btn As Button = TryCast(sender, Button)

    If btn IsNot Nothing Then

      'aqui trabjas con el boton de forma seguro, proque es un boton ya que puso castear

      ' pero lo buenoe s que no falla con un error

    End If

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Arthuro Zerda martes, 2 de agosto de 2011 13:08
    lunes, 1 de agosto de 2011 23:46

Todas las respuestas

  • Por ahi esto te sirve

    link


    Lima-Perú

    lunes, 1 de agosto de 2011 23:03
  • hola

    revisa de este link

    http://msdn.microsoft.com/es-es/library/zyy863x8.aspx

    la tabla que lleva el titulo

    Palabras clave para conversiones

    alli veras la compracion entres estos 3 metodos, es mas tienes los links a cada uno

     

    igualmente la diferencia la noto con el TryCast, el cual es un casteo optimista, porque sino puede convertir nod a error sino que devuelve Nothing, lo cual lo hace ideal ante algunas situaciones en dodne necesitas convertir para luego validar si se pudo hacerlo

    en un evento podrias intentar castear a un conmtrol para ver si es de este tipo o no

    Dim btn As Button = TryCast(sender, Button)

    If btn IsNot Nothing Then

      'aqui trabjas con el boton de forma seguro, proque es un boton ya que puso castear

      ' pero lo buenoe s que no falla con un error

    End If

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Arthuro Zerda martes, 2 de agosto de 2011 13:08
    lunes, 1 de agosto de 2011 23:46
  • "Arthuro Zerda" preguntó:

    > que diferencia hay entre estas tres
    > funciones antes mensionadas?
    >
    > cuando usar cada una de ellas?

    Hola, Arturo:

    Se trata de tres operadores de conversión que se pueden utilizar en Visual Basic, entre otros cuantos más, para convertir datos de un tipo en otro tipo de dato diferente. Pero si bien los tres operadores se utilizan para convertir datos, cada uno tiene su característica particular que lo diferencia de los demás.

    Voy a explicar las diferencias entre uno y otro operador desde la perspectiva personal del que menos utilizo (TryCast) al que más utilizo (DirectCast).

    TryCast
    =======
    Es el más fácil de utilizar y el que menos problema da, porque nunca produce una excepción si no se puede convertir un tipo de dato a otro. Quizás sea éste el motivo por el que apareció con la versión 2005 de Visual Basic: para evitar que los desarrolladores inexpertos obtuvieran errores de conversión cuando utilizaban los operadores CType o DirectCast con las primeras versiones de Visual Basic .NET.

    Esto último, unido a que la mayoría de éstos usuarios tienen desactivada la instrucción Option Strict (cuestión que no recomiendo que se haga), hace que el operador TryCast sea el preferido entre usuarios que no se preocupan demasiado de escribir código a prueba de errores o excepciones de conversión.

    Pero ahora, en lugar de una excepción InvalidCastException obtienen un valor Nothing si la conversión no ha tenido éxito, que lo mismo el usuario inexperto no sabe muy bien lo que tiene que hacer con un valor Nothing. :-D

    El operador TryCast solamente se puede utilizar con tipos de datos por referencia, es decir, aquellos tipos de datos que sean clases o interfaces. Pero no se puede utilizar si se trata de un tipo de dato por valor (Integer, Double, Long, o cualquier tipo definido como una estructura). Es decir, la siguiente conversión no está permitida con el operador TryCast:

     Dim index As Integer = 45
     Dim d As Double = TryCast(index, Double) ' <-- No permitido
    


    No se puede utilizar el operador TryCast para convertir un valor cualquiera en Double, Integer, Long, Byte, Single o cualquier otro tipo de datos definidio como Structure.

    Nunca utilizo el operador TryCast en mi código fuente, quizás lo haya hecho en los ejemplos que publico en éste foro, porque prefiero capturar una excepción del tipo InvalidCastException antes de obtener un valor Nothing. Aparte que teniendo activada la instrucción Option Strict, y haciendo un buen uso de los operadores CType o DirectCast, es menos probable que se obtenga una excepción o un valor Nothing.

    CType
    =====
    Es el operador más versátil de los tres, porque se puede utilizar para realizar conversiones tanto con tipos de datos por referencia (clases e interfaces) como con tipos de datos por valor (estructuras, Integer, Long, Single, etc.). Por supuesto, si la conversión no se puede efectuar, en tiempo de ejecución se podría obtener una excepción OverflowException (error en una conversión de restricción entre tipos de datos integrales) o InvalidCastException (la conversión no se puede efectuar por ser indefinida), por lo que habría que encerrar la llamada al operador CType entre un bloque Try ... End Try para capturar dicha excepción.

    Con el operador CType, sí podemos convertir un valor Integer en Double:

     Dim index As Integer = 45
     Dim d As Double = CType(index, Double)
    


    De vez en cuando suelo utilizar el operador CType, y siempre que lo he hecho, ha sido para efectuar conversiones entre tipos de datos por valor o estructuras. Para las conversiones entre tipos de datos numéricos prefiero utilizar otros operadores de conversión que nos proporciona tanto el lenguaje Visual Basic (CDbl, CInt, CStr, etc.), como el propio marco de trabajo de .NET (Convert.ToString, Convert.ToDouble, Convert.ToInt32, etc.).

    DirectCast
    ==========
    Es mi operador de conversión preferido y el que suelo utilizar para efectuar conversiones entre tipos de datos por referencia (clases e interfaces). No está permitido utilizar el operador DirectCast con tipos de datos por valor (Integer, Long, Decimal, etc.).

     ' Referenciamos el objeto DataTable
     ' enlazado con el control DataGridView
     ' 
     Dim dt As DataTable = _
      DirectCast(DataGridView1.DataSource, DataTable)
    


    El motivo que prefiera DirectCast a CType es porque el primero proporciona un mayor rendimiento, ya que no hace uso de código auxiliar para llevar a efecto la conversión. No es que el tiempo que utiliza CType para realizar la conversión sea significativo, pero ¿para qué ejecutar más código del que sea estrictamente necesario? ;-)

    Ni que decir tiene que si la conversión no se puede efectuar con el operador DirectCast, se producirá una excepción del tipo InvalidCastException en tiempo de ejecución, por lo que se aconseja encerrar el código de llamada entre un bloque Try ... End Try.

    A diferencia del operador CType, el operador DirectCast no producirá una excepción OverflowException, ya que éste último operador no puede utilizarse para efectuar conversiones entre tipos de datos por valor (valores numéricos u otro tipo de dato definido como estructura):

     Dim index As Integer = 45
     Dim d As Double = DirectCast(index, Double) ' <-- No permitido
    


    DirectCast y TryCast trabajan de la misma manera para efectuar conversiones entre tipos de datos por referencia, pero mientras que DirectCast puede causar una excepción InvalidCastException en tiempo de ejecución, el operador TryCast devolverá un valor Nothing en lugar de lanzar una excepción.

    En fin, espero que la breve explicación te haya servido para despejar alguna que otra duda con los operadores de conversión. :-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    martes, 2 de agosto de 2011 7:47
    Moderador