Controllo del tipo: typeof, GetType, o is?

Ho visto molte persone usare il seguente codice:

Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

Ma so che si può anche fare così:

if (obj1.GetType() == typeof(int))
    // Some code here

O questo:

if (obj1 is int)
    // Some code here

Personalmente, sento che l'ultimo è il più pulito, ma c'è qualcosa che mi sfugge? Qual è il migliore da usare, o è una preferenza personale?

Usate typeof quando volete ottenere il tipo al tempo di compilazione. Usate GetType quando volete ottenere il tipo al tempo di esecuzione. Raramente ci sono casi in cui si deve usare is, perché fa un cast e, nella maggior parte dei casi, si finisce comunque per fare il casting della variabile.

C'è una quarta opzione che non hai considerato (specialmente se hai intenzione di lanciare anche un oggetto al tipo che trovi): usare as.

Foo foo = obj as Foo;

if (foo != null)
    // your code here

Questo usa solo un cast mentre questo approccio:

if (obj is Foo)
    Foo foo = (Foo)obj;

richiede due.

Commentari (6)

Credo che l'ultimo guardi anche l'ereditarietà (ad esempio Dog is Animal == true), che è meglio nella maggior parte dei casi.

Commentari (0)

Dipende da quello che sto facendo. Se ho bisogno di un valore bool (ad esempio, per determinare se farò il cast di un int), userò is. Se ho effettivamente bisogno del tipo per qualche motivo (ad esempio, per passare a qualche altro metodo) userò GetType().

Commentari (1)