Conversão de tipos de variáveis no C#
Veja neste artigo como funciona alguns tipos de conversão de variáveis, dentre eles os tipos implícito, explícito, boxing e unboxing, e var.
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.
numero = Convert.ToInt32(textBox1.Text);
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
short,int,long,float,double, ou decimal
short,ushort,int,uint,long,ulong,float,double, ou decimal
int,long,float,double, oudecimal
int,uint,long,ulong,float,double, ou decimal
long,float,double, oudecimal
long,ulong,float,double, oudecimal
float,double, oudecimal
ushort,int,uint,long,ulong,float,double, ou decimal
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;
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.
byte,ushort,uint,ulong, ouchar
Sbyteou char
sbyte,byte,ushort,uint,ulong, ouchar
sbyte,byte,short, ouchar
sbyte,byte,short,ushort,uint,ulong ou char
sbyte,byte,short,ushort,int ouchar
sbyte,byte,short,ushort,int,uint,ulong ouchar
sbyte,byte,short,ushort,int,uint,long ouchar
sbyte,byte oushort
sbyte,byte,short,ushort,int,uint,long,ulong,char oudecimal
sbyte,byte,short,ushort,int,uint,long,ulong,char,float ou 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.
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.
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.
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.
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.
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 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.