C# - Conversão entre tipos : implícita e explícita - I
Hoje veremos o conceito de conversão implícita e explícita na linguagem C#. |
Na linguagem C #, existe um conceito chamado Conversões de tipo, que converte um tipo em outro.
Como a linguagem C# é estaticamente tipada em tempo de compilação, após uma variável ser declarada, ele não pode ser declarada novamente ou usada para armazenar valores de outro tipo, a menos que esse tipo seja convertível para o tipo da variável.
No entanto, às vezes você pode precisar copiar um valor em uma variável ou parâmetro de método de outro tipo; ou pode precisar atribuir uma variável de classe a uma variável de um tipo de interface.
Esses tipos de operações são chamados conversões de tipo. Dentro os tipos de conversões tempos as conversões explicitas e sa implícitas.
Assim existem dois
tipos de conversões :
1. Conversão implícita
2. Conversão explícita
1- Conversão implícita
A conversão entre tipos que pode ser realizada automaticamente é conhecida como
Implícita :
Ex:
byte valor1 = 10;
byte valor2 = 23;
long total = valor1 + valor2;
Aqui neste exemplo, não precisamos especificar o tipo de dados para o tipo de
destino; internamente, ele converterá o que está implícito.
valor1 e valor2 são
do tipo byte ao adicionar, atribuímos o valor a uma variável
total que é um tipo
de dados long.
Internamente, ele converte o valor do resultado em um tipo de dados
long.
2- Conversão explícita
A conversão entre tipos que pode ser feita manualmente, em vez de
automaticamente :
Ex:
long valor = 3000;
int a = (int)
valor ; /* conversão válida. Valor máximo é
2147483647 */
Neste exemplo acima, podemos ver que valor é um
tipo de dados long, para converter para o tipo
int
temos que atribuir explicitamente o int indicando para qual tipo de dados temos
que converter.
Se não informarmos explicitamente o tipo int o compilador vai emitir um aviso:
"Cannot implicitly convert type 'long' to 'int'. An explicit conversion exists(are you missing a cast?)"
A
palavra-chave implicit é usada para declarar um operador de
conversão
implícita de tipo definido pelo usuário. Use-a para habilitar conversões
implícitas entre um tipo definido pelo usuário e outro tipo, se houver garantia
de que a conversão não causará perda de dados.
A palavra-chave explicit declara um operador de conversão de tipo definido pelo usuário que deve ser invocado com uma conversão. Ela é usada na sobrecarga de operador.
Vamos ver na prática como funciona essa conversão implícita e explícita em um exemplo mais consistente.
recursos usados:
Criando o projeto no VS 2019 Community
Vamos criar um projeto usando a linguagem C# do tipo Console App para .NET Framework. Podemos chamar o projeto de CShp_Conversor
Exemplo de uso de explicit :
using System;
namespace CSharp_RecursosRaros
{
class Apartmento
{
public string Nome { get; set; }
public static explicit operator Casa(Apartmento a)
{
return new Casa() { Nome = a.Nome };
}
}
class Casa
{
public string Nome { get; set; }
public static explicit operator Apartmento(Casa c)
{
return new Apartmento() { Nome = c.Nome };
}
}
class Program
{
static void Main(string[] args)
{
Casa casa = new Casa();
casa.Nome = "Minha Casa";
// Converte uma Casa para um Apartamento
Apartmento apartamento = (Apartmento)casa;
// Apartamento foi convertido de Casa
Console.WriteLine(apartamento.Nome);
}
}
} |
Neste exemplo temos duas classes:
1 - Apartamento Cada uma fornece um operador público explicit
Esses operadores explícitos são implementados através da construção de
uma nova instância do tipo de destino. Assim, o Apartamento ou Casa é agora do tipo oposto, mas tem o mesmo campo de dados. Quando você usa um cast como (Apartamento) ou (Casa), este é um cast explícito. Um cast implícito não usa essa sintaxe. |
Exemplo de operador implicit :
namespace CSharp_RecursosRaros
{
struct Digito
{
byte valor;
public Digito(byte valor)
{
if (valor > 9)
{
throw new System.ArgumentException();
}
this.valor = valor;
}
//operador de conversão implicita de Digito para byte
public static implicit operator byte(Digito d)
{
System.Console.WriteLine("Conversão realizada");
return d.valor; // conversão implicita
}
}
class Program
{
static void Main(string[] args)
{
Digito d = new Digito(3);
byte b = d; // conversão implicita -- não precisa fazer o cast
}
}
}
|
Este exemplo demonstra um operador
de conversão implícita definindo um operador de conversão que converte
de uma classe de valor chamada Digito no tipo
Byte. Como qualquer dígito pode ser convertido em um Byte, não há necessidade de forçar os usuários a serem explícitos com relação à conversão. |
Assim é possível usar o operador de conversão implicit, ou o operador explicit, que é indicado para alguém que lê o código que está convertendo em um tipo.
Você só deve
usar o operador implicit se estiver
desenvolvendo um tipo comumente usado. Provavelmente é mais útil para o próprio
.NET Framework.
Portanto: o operador implicit não é algo que
a maioria dos programas exige. Vale a pena saber que existe, mas nem sempre é
útil.
Concluindo, assim como implicit, a palavra-chave
explicit pode ser usada para implementar
conversões. Você deve ter cuidado ao implementar conversões para que sejam
reversíveis e façam sentido.
Na proxima parte do artigo veremos outras formas de conversão entre tipos.
"Porque
Deus não nos destinou para a ira, mas para a aquisição da salvação, por nosso
Senhor Jesus Cristo,
Que morreu por nós, para que, quer vigiemos, quer durmamos, vivamos juntamente
com ele."
1 Tessalonicenses
5:9,10
DVDs com
programas para estudo e Cursos de VB .NET e C#
Visite a loja
on-line para ver todos os cursos :
Loja do
Macoratti.net |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
C# - StreamReader, StringReader e TextReader . Qual a ... - Macoratti
C# - Imprimindo um arquivo texto - Macoratti
C# - Usando OpenFileDialog - Macoratti
C# - Formatando arquivos textos - Macoratti
C# - Convertendo valores para o formato monetário
C# - Lendo e escrevendo em arquivos textos e binários - Macoratti
VB.NET - Conversão entre tipos de variáveis - Macoratti
C# - Localizando Arquivos - Macoratti