Uma situação comum para o desenvolvedor é a conversão de valores em uma aplicação, por exemplo, quando possui um formulário onde o usuário digita as informações e as mesmas são passadas para variáveis ou atributos de objetos para depois serem gravadas no banco de dados ou realizar alguma outra operação.

No nosso exemplo, os dados vindos do formulário serão do tipo String e no caso de um campo que contenha número precisará ser convertido para inteiro para poder ser armazenado na variável. O conteúdo poderá ser convertido para inteiro utilizando o código da Listagem 1.

Listagem 1. Conversão de valor string para inteiro.


              int numero;
              numero = Convert.ToInt32(textBox1.Text);
  

Tipos de conversão

No C# existem vários tipos de conversões de dados. Vejamos alguns deles.

1. Conversão implícita: é aquela em que não é necessário nenhum código especial, pois se trata de uma conversão segura, sem risco de perda de dados. Observe a Listagem 2.

Listagem 2. Conversão implícita


              int numero = 1234;
              decimal numero2 = numero;
  

A Tabela 1 contém os tipos que permitem conversões implícitas.

Tabela 1. Tabela de conversões numéricas implícitas - Fonte: Adaptado de Microsoft

De

Para

sbyte

short,int,long,float,double, ou decimal

Byte

short,ushort,int,uint,long,ulong,float,double, ou decimal

short

int,long,float,double, oudecimal

ushort

int,uint,long,ulong,float,double, ou decimal

int

long,float,double, oudecimal

uint

long,ulong,float,double, oudecimal

Long

float,double, oudecimal

char

ushort,int,uint,long,ulong,float,double, ou decimal

float

double

ulong

float,double, ou decimal

2.Conversão explícita (casts): esse tipo de conversão necessita de um operador. É realizado quando há a necessidade de se converter um valor e pode ocorrer perda de informações.

Para fazer um cast, deve ser informado o tipo entre parênteses na frente da variável que será convertida, como é demonstrado na Listagem 3.

Listagem 3. Exemplo de cast.


              double num = 123.4;
              int num2;
              num2 = (int)num;
  

A Tabela 2 contém as possíveis conversões explicitas que podem ser realizadas.

Tabela 2. Possíveis conversões explicitas - Fonte: Adaptado de Microsoft.

De

Para

sbyte

byte,ushort,uint,ulong, ouchar

Byte

Sbyteou char

short

sbyte,byte,ushort,uint,ulong, ouchar

ushort

sbyte,byte,short, ouchar

int

sbyte,byte,short,ushort,uint,ulong ou char

uint

sbyte,byte,short,ushort,int ouchar

Long

sbyte,byte,short,ushort,int,uint,ulong ouchar

ulong

sbyte,byte,short,ushort,int,uint,long ouchar

char

sbyte,byte oushort

float

sbyte,byte,short,ushort,int,uint,long,ulong,char oudecimal

double

sbyte,byte,short,ushort,int,uint,long,ulong,char,float ou decimal

decimal

sbyte,byte,short,ushort,int,uint,long,ulong,char,float oudouble

É preciso cuidado e atenção ao utilizar conversões explicitas devidos as possíveis perdas de informações e arredondamentos.

3.Conversões definidas pelo usuário: são conversões realizadas por métodos criados pelos desenvolvedores que contém o código que converta as informações para a maneira desejada.

4.Conversões com classes auxiliares: são as conversões em que, por exemplo, o desenvolvedor utiliza a classe System.Convert para converter para o tipo desejado ou o método Parse dos tipos de dados.

Neste link: http://msdn.microsoft.com/pt-br/library/system.convert.aspx, há uma tabela que contém todos os métodos e mostra as possíveis conversões utilizando a classe System.Convert.

A Listagem 4 demonstra como utilizar a classe Convert.

Listagem 4. Exemplo de uso da classe Convert.


       int num;
              num = Convert.ToInt32("123");
  

A Listagem 5 demonstra como realizar uma conversão utilizando o método Parse.

Listagem 5. Exemplo de uso do método parse.


              int num;
              num = Int32.Parse("123");
  

No caso da Listagem 4 foi realizada uma conversão para inteiro, mas o método Parse está presente em outros tipos de dados.

Também existe o método TryParse que é como o método Parse. A diferença é que ele lança uma exceção se algum erro ocorrer.

Outra conversão que é bastante útil é a conversão para String. No caso do código da Listagem 4, se for necessário exibir o número que está na variável num através de um MessageBox, será necessário converte-lo para String. Isso é possível utilizando o método ToString, conforme mostra a Listagem 6.

Listagem 6. Exemplo de uso do método ToString.


              int num;
              num = Int32.Parse("123");
   
              MessageBox.Show(num.ToString());
  

5. Boxing : é uma conversão implícita que converte um valor de tipo de valor para um tipo de objeto, ou seja, de um Value Type para Reference Type.

Na Listagem 7 temos uma demonstração de um boxing.

Listagem 7. Exemplo de boxing.


              int num;
              num = 123;
   
              object o;
              o = num;
  

6.Unboxing é quando acontece o inverso, ou seja, quando há uma conversão de um tipo de objeto para um tipo de valor, de Reference Type para Value Type.

A Listagem 8 contém o código que demonstra um unboxing.

Listagem 8. Exemplo de unboxing.


              int num;
              num = 123;
   
              object o;
              o = num;
   
              int num2;
              num2 = (int)o;
  

7.Var: essa palavra reservada pode ser usada como um tipo de dados para declaração de variáveis. Quando ela é usada, o compilador irá escolher qual é o tipo de dados mais apropriado para a variável.

A Listagem 9 demonstra o seu uso.

Listagem 9. Exemplo de uso de var.


              var num = 123;
   
              var texto = "Olá";
  

Vale ressaltar que o var não significa variant, apenas significa que o compilador é que vai decidir o tipo apropriado.

Há também algumas considerações que devem ser levadas em conta:

  • Var só pode ser usada em variáveis locais e devem ser inicializadas;
  • Não podem ser inicializadas com valor nulo;
  • Não podem ser utilizadas em campos no escopo de classe;
  • Não pode ser usada em expressões de inicializações;
  • Múltiplas variáveis não podem ser inicializadas em uma única instrução;
  • Se existir um tipo chamado Var no escopo, isso será resolvido e esse nome de tipo não será tratado como parte de uma declaração de variável local implícita.

Com isso, neste artigo foi apresentado como realizar conversão de dados entre tipos. A conversão de tipos é uma operação muito útil e frequentemente utilizada no desenvolvimento de uma aplicação, mas deve-se sempre tomar cuidado para não ocorrer perda de dados e também é preciso se atentar sobre os arredondamentos que ocorrem em algumas conversões com casas decimais. Também foi explicado o conceito de boxing e unboxing e apresentado o uso a palavra reservada var.

Obrigado e até a próxima.