Avatar ·

Verificação de Tipos em C#: typeof, GetType() ou is — o que e quando usar?

Olá a todos. Sou um desenvolvedor C# iniciante e constantemente me confundo com verificações de tipos. Existem três maneiras: `typeof`, o método `GetType()` e o operador `is`. \n\nPor exemplo, tenho este código:\n\n```csharp\nobject obj = "Hello";\n\n// Opção 1\nif (obj.GetType() == typeof(string))\n Console.WriteLine("Isso é uma string via GetType");\n\n// Opção 2\nif (obj is string)\n Console.WriteLine("Isso é uma string via is");\n\n// Opção 3\nType t = typeof(string);\n```\n\nParece que todos os três verificam o tipo, mas percebo um comportamento estranho. Quando uso `is` com tipos nullable, ele se comporta de forma diferente de `GetType()`. Por exemplo:\n\n```csharp\nint? x = 5;\nif (x is int) // true\n Console.WriteLine("x is int");\n\nif (x.GetType() == typeof(int)) // também true\n Console.WriteLine("x.GetType == typeof(int)");\n```\n\nMas se x = null, então `x is int?` retorna false, e `GetType()` lançará uma NullReferenceException. \n\nE mais um ponto: li que `typeof` funciona apenas com tipos em tempo de compilação, enquanto `GetType...