Verificação de Tipo em C#: typeof, GetType ou is? Análise Completa

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Verificação de Tipo em C#: typeof, GetType ou is? Como não se confundir com três opções

\n\n

Todo desenvolvedor C#, mais cedo ou mais tarde, se depara com a necessidade de verificar o tipo de um objeto. Parece simples, não? Mas quando você tem três opções — typeof, GetType() e is — os olhos se perdem e surge a pergunta inevitável: "Qual deles devo escolher?".

\n\n

Este artigo não é apenas um resumo seco da documentação. Vamos analisar cada abordagem com exemplos reais, identificar armadilhas e dar recomendações claras. Após a leitura, você vai parar de adivinhar e saberá exatamente qual ferramenta usar em cada situação. Vamos lá!

\n\n

Por que verificar tipos em C#?

\n\n

Antes de mergulharmos nos detalhes, vamos lembrar por que isso é necessário. C# é uma linguagem fortemente tipada, mas isso não elimina situações em que o tipo de um objeto só é conhecido em tempo de execução. Aqui estão os cenários mais comuns:

\n\n
    \n
  • Trabalho com interfaces e classes base: Você recebe um objeto como object ou um tipo base, e precisa saber seu tipo real.
  • \n
  • Serialização e desserialização: JSON ou XML chegam como string, e é necessário restaurar o tipo específico.
  • \n
  • Reflexão (Reflection): Quando você cria objetos dinamicamente ou chama métodos, sabendo apenas o nome do tipo.
  • \n
  • Registro de logs e depuração: Às vezes, você só precisa registrar no log com qual tipo está trabalhando.
  • \n
\n\n

E é aqui que entram nossos três heróis. Vamos conhecer cada um mais de perto.

\n\n

typeof — uma visão estática do futuro

\n\n

typeof é um operador que retorna um objeto System.Type para um tipo conhecido em tempo de compilação. Ele funciona como um serviço de informações: "Diga-me o nome da classe, e eu te darei todas as informações sobre ela".

\n\n

Como funciona:

\n
Type stringType = typeof(string);\nConsole.WriteLine(stringType.FullName); // Saída: System.String\n\nType intType = typeof(int);\nConsole.WriteLine(intType.FullName); // Saída: System.Int32
\n\n

Característica principal: typeof não requer uma instância do objeto. É uma operação estática. Você diz ao compilador: "Eu tenho o tipo MyClass, me dê seus metadados".

\n\n

Quando usar:

\n
    \n
  • Quando você precisa do tipo pelo nome da classe, e não por um objeto.
  • \n
  • Em atributos (por exemplo, [AttributeUsage(typeof(MyAttribute))]).
  • \n
  • Em genéricos: typeof(List<>).
  • \n
\n\n

Armadilha: typeof sempre retorna o tipo exato que você especificou no código. Ele não sabe sobre herança. Se você tem class Dog : Animal { }, então typeof(Animal) nunca será typeof(Dog).

\n\n

GetType() — investigação dinâmica

\n\n

Ao contrário de typeof, o método GetType() é chamado em uma instância do objeto. Ele pega o objeto real na memória e diz: "Ah, então é você de verdade!".

\n\n

Exemplo:

\n
object obj = "Olá, mundo!";\nType typeOfObj = obj.GetType();\nConsole.WriteLine(typeOfObj.FullName); // Saída: System.String\n\n// Agora um truque:\nobject obj2 = 42;\nType typeOfObj2 = obj2.GetType();\nConsole.WriteLine(typeOfObj2.FullName); // Saída: System.Int32
\n\n

Observe: a variável obj é declarada como object, mas GetType() "enxerga" através dessa camada e retorna System.String. Isso é a determinação dinâmica de tipo.

\n\n

Quando usar:

\n
    \n
  • Quando você precisa saber o tipo exato de um objeto em tempo de execução.
  • \n
  • Para comparação de tipos: obj.GetType() == typeof(MyClass).
  • \n

Blogs

Book Recommendations