VB.NET - Casting : Ctype e DirectCast


Tanto o VB.NET como C# são linguagens fortemente tipadas ( como Java), isto significa que o compilador verifica por compatibilidades de tipos em tempo de execução em quase todos os casos , impedindo atribuições incompatíveis , proibindo atribuições questionáveis e fornecendo casts quando a compatibilidade de um tipo puder ser determinada apenas em tempo de execução.

Algumas conversões ocorrem automaticamente, sem você ter que se preocupar. Por padrão no VB.NET o casting é automático quando você atribui objetos a variáveis. Os objetos são então convertidos à força para o tipo da variável. Este comportamento pode ser influenciado pelas declarações:

- Option Strict On - (padrão) - o casting é restrito é não é automático
- Option Strict Off - permite conversões implícitas no seu código

Para realizar um casting explícito (conversão forçada) podemos usar o operador Ctype() ou DirectCast()

Dim Q As Object = 2.37                                     ' Requer Option Strict Off.
Dim I As Integer = CType(Q, Integer)           ' Funciona
Dim J As Integer = DirectCast(Q, Integer)   ' Falha
Explicando: O tipo de Q em tempo de execução é Double .
                  Como você pode converter Double para Integer , Ctype funciona.
                  DirectCast Falha porque o tipo de Q em tempo de execução Não é Integer.

Ambas as palavras chaves tomam uma expressão a ser convertida como primeiro argumento e o tipo a converter como segundo argumento.

Se não houver uma conversão definida entre o tipo de dados da expressão e o tipo especificado a ser convertido tanto Ctype como DirectCast não irão funcionar. Tanto Ctype como DirectCast lançam a exceção InvalidCastException.

Qual a diferença entre Ctype e DirectCast ?

A diferença entre os dois é que para funcionar , Ctype apenas necessita que haja uma conversão válida definida entre a expressão e o tipo para o qual a conversão vai ser feita ;  DirectCast requer que o tipo em tempo de execução de uma variável objeto seja o mesmo que o tipo especificado para conversão.

Se o tipo definido e o tipo da expressão em tempo de execução forem o mesmo , o desempenho de DirectCast é melhor do que o de Ctype.

Então , se você tem certeza de que a expressão é do mesmo tipo para o qual a conversão vai ser realizada use DirectCast ; se tiver dúvidas use Ctype.

Como eu posso verificar o tipo particular de um objeto ?

R: Usando o operador TypeOf.

Exemplo :  Para verificar se obj é do tipo TextBox fazemos:   If TypeOf obj Is TextBox Then...

Nota: Para obter um objeto do tipo System.Type para um tipo definido use o operador GetType e para obter um objeto do tipo Sytem.Type para um objeto use o método GetType.

Dim t As System.Type
t = GetType(String)
MessageBox.Show(t.FullName)
Dim t as System.Type
t = obj.GetType()
MessageBox.Show(t.FullName)
 
operador GetType Método GetType

Concluindo ...

1- CType é capaz de realizar uma conversão forçada(Casting) ou uma conversão. DirectCast faz apenas a conversão.

Por conversão eu quero dizer que um tipo de dados é convertido em outro . Ex: String para integer, object para string , etc...

Por conversão forçada (cast) eu quero dizer que a alteração de um tipo de objeto em outro tipo relacionado é feito se:

- o tipo para o qual você esta convertendo o objeto é do mesmo tipo do objeto :

Dim j as String = "Macoratti"
Dim c as Object = j
Dim m as string = directcast(c, String)

Como a variável c é um objeto que contém uma string logo podemos usar DirectCast para fazer um cast para m pois m é do mesmo tipo de c. Se não fosse teríamos que usar Ctype.

2- DirectCast é mais rápido que Ctype

Exemplo:

Dim obj1 As Object
Dim obj2 As Object
Dim i As Integer

obj1 = 1     
' o1 contém um inteiro empacotado
obj2 = "1"    ' o2 contém um string

' Funciona pois obj1 contém um integer
i = DirectCast(obj1, Integer)

' Falha pois obj2 contém uma string que é diferente de Integer
i = DirectCast(obj2, Integer)

' Funciona pois existe uma conversão de String para Integer
i = CType(obj2, Integer)

Até o próximo artigo ...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti