« Voltar
em .net c#

Qual a diferença entre cast e convert?.

Já me perguntaram isso algumas vezes e eu mesmo já fiquei na dúvida de como explicar.

Cast

Vamos pegar como exemplo a classe Funcionario:

public class Funcionario  
{
    //atributos e métodos
}

E a classe Programador, que herda de Funcionario:

public class Programador : Funcionario  
{
    //atributos e métodos
}

Agora, vamos olhar o seguinte método:

public void CalculaAlgo(Funcionario funcionario)  
{
    Programador p = (Programador) funcionario;
    //faz alguma coisa...
}

Dentro do método, estamos fazendo um cast explícito.
Quando fazemos um cast, estamos dizendo ao compilador: "olha, sei que estamos tratando isso aqui como Funcionário, mas eu sei mais que você e sei que na verdade isso aqui é um Programador. Então, daqui pra frente, trate-o como um Programador".

Quando fazemos cast, estamos por nossa conta e risco. Assumimos que sabemos mais que o compilador.

E se o que estiver dentro da variável funcionario não for um Programador?
Aí vai rolar uma Exception em tempo de execução. Isso porque o compilador não sabe se o que está dentro da variável é realmente um Programador. Ele não tem como verificar isso.

Mas eu sei. Então eu quero que ele o trate como tal.

A mesma coisa vale para o seguinte exemplo:

double pi = 3.14;  
int intPi = (int)pi;  

Aqui estamos fazendo a mesma coisa, mas com tipos primitivos.
Estou falando pro compilador: "eu sei que isso é um double, mas o que tem dentro dele é um int, então quero que você o trate como tal".

Mas nesse caso, o que ficará guardado dentro da variável intPi é o número 3, e não 3.14.
Isso porque variáveis do tipo int não conseguem guardar casas decimais.

Ou seja: é bom você ter certeza do que está fazendo quando faz um cast.

Convert

Vamos pegar o código anterior e ver o que muda com Convert:

double pi = 3.14;  
int intPi = Convert.ToInt32(pi);  

O resultado é o mesmo, intPi vai guardar 3. Só que aqui não estamos dizendo nada ao compilador.
Estamos chamando um método, ou seja: "eu sei que pi não é um inteiro, mas tem uma forma de transformar ele num inteiro, certo? Ok, use esse método e crie um inteiro pra mim com o valor da variável pi".

Quando usamos Convert estamos transformando, criando um novo objeto de um tipo específico através de um método. O código que usamos realmente dá significado, dá semântica pro que estamos fazendo.

string stringPi = 3.14;  
double doublePi = Convert.ToDouble(pi);  

stringPi não é um double, mas uma string. Mas eu quero que você transforme a string em double pra mim. Converta. Você muda a representação do objeto.

No exemplo anterior, eu poderia criar um método meu que transforma um Funcionario em Programador:

public void CalculaAlgo(Funcionario funcionario)  
{
    Programador p = ClasseQueConverte.ToProgramador(funcionario);
    //faz alguma coisa...
}

Criamos um método, que nada mais é que um procedimento pra criar um objeto de outro tipo e retornar a sua representação.

Não estamos dizendo ao compilador para tratar algo de forma diferente. Estamos executando um comportamento que realmente faz a transformação de um objeto em outro.


Gostou desse post?
Confira outros que acho que também vai gostar:
Calma: fazer as coisas bem leva tempo
Quer ficar bom em algo? Faça uma coisa de cada vez
Se acha muito velho pra aprender a programar? Pense de novo
Cuidado com ofertas de trabalho que focam no que não é importante
4 dicas para ser chamado para entrevistas
7 podcasts de programação e tecnologia que você tem que ouvir
Já se sentiu um impostor? Eu também
O guia do programador iniciante: como ter um portfólio nunca tendo trabalhado com programação

Quer ficar em dia com os meus posts e novidades? Se inscreva na minha newsletter, me segue no Twitter e na minha página!

comments powered by Disqus