Έλεγχος τύπου: typeof, GetType ή is?

Έχω δει πολλούς ανθρώπους να χρησιμοποιούν τον ακόλουθο κώδικα:

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

Αλλά ξέρω ότι μπορείτε να κάνετε και αυτό:

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

Ή αυτό:

if (obj1 is int)
    // Some code here

Προσωπικά, αισθάνομαι ότι το τελευταίο είναι το πιο καθαρό, αλλά μήπως υπάρχει κάτι που μου διαφεύγει; Ποιο είναι το καλύτερο για χρήση, ή είναι προσωπική προτίμηση;

Χρησιμοποιήστε το typeof όταν θέλετε να λάβετε τον τύπο κατά τη χρονική στιγμή της μεταγλώττισης. Χρησιμοποιήστε το GetType όταν θέλετε να λάβετε τον τύπο σε χρόνο εκτέλεσης. Σπάνια υπάρχουν περιπτώσεις για να χρησιμοποιήσετε το is καθώς κάνει cast και, στις περισσότερες περιπτώσεις, καταλήγετε να κάνετε casting της μεταβλητής ούτως ή άλλως.

Υπάρχει και μια τέταρτη επιλογή που δεν έχετε σκεφτεί (ειδικά αν πρόκειται να κάνετε casting ενός αντικειμένου στον τύπο που θα βρείτε επίσης)- αυτή είναι να χρησιμοποιήσετε το as.

Foo foo = obj as Foo;

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

Αυτό χρησιμοποιεί μόνο ένα cast ενώ αυτή η προσέγγιση:

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

απαιτεί δύο.

Σχόλια (6)

Πιστεύω ότι η τελευταία εξετάζει επίσης την κληρονομικότητα (π.χ. Dog is Animal == true), η οποία είναι καλύτερη στις περισσότερες περιπτώσεις.

Σχόλια (0)

Εξαρτάται από το τι κάνω. Αν χρειάζομαι μια τιμή bool (ας πούμε, για να καθορίσω αν θα κάνω cast σε int), θα χρησιμοποιήσω το is. Αν πραγματικά χρειάζομαι τον τύπο για κάποιο λόγο (ας πούμε, για να τον περάσω σε κάποια άλλη μέθοδο), θα χρησιμοποιήσω την GetType().

Σχόλια (1)