Type Checking em C#: typeof, GetType() ou is? Quando usar cada um?
Olá a todos! Sou um desenvolvedor C# iniciante e não consigo entender a verificação de tipos em C#. Existem três formas: o operador `typeof`, o método `GetType()` e o operador `is`. Mas quando usar cada um?
Aqui está um exemplo que me confunde:
```csharp
object obj = "Hello, world!";
// Forma 1
if (obj.GetType() == typeof(string))
Console.WriteLine("Isso é uma string (GetType)");
// Forma 2
if (obj is string)
Console.WriteLine("Isso é uma string (is)");
// Forma 3
Type t = typeof(string);
if (obj.GetType() == t)
Console.WriteLine("Isso é uma string (typeof)");
```
Todas as três opções funcionam, mas sinto que não são intercambiáveis. Por exemplo, ouvi dizer que `typeof` funciona apenas com tipos em tempo de compilação, enquanto `GetType()` funciona em tempo de execução. E `is` é meio mágico —