Type Checking en C#: typeof, GetType() o is? ¿Cuándo usar qué?
¡Hola a todos! Soy un desarrollador principiante de C# y no puedo entender la verificación de tipos en C#. Hay tres formas: el operador `typeof`, el método `GetType()` y el operador `is`. Pero, ¿cuándo usar cuál?
Aquí hay un ejemplo que me confunde:
```csharp
object obj = "Hello, world!";
// Forma 1
if (obj.GetType() == typeof(string))
Console.WriteLine("Esto es un string (GetType)");
// Forma 2
if (obj is string)
Console.WriteLine("Esto es un string (is)");
// Forma 3
Type t = typeof(string);
if (obj.GetType() == t)
Console.WriteLine("Esto es un string (typeof)");
```
Las tres opciones funcionan, pero siento que no son intercambiables. Por ejemplo, he oído que `typeof` solo funciona con tipos en tiempo de compilación, mientras que `GetType()` lo hace en tiempo de ejecución. Y `is` es algo mágico: parece que verifica y convierte el tipo al mismo tiempo.
Por favor, aclárenme:
1. ¿Cuál es la diferencia fundamental entre `typeof`, `GetType()` y `is`?
2. ¿Cuándo usar cada uno para que el código sea correcto?