Tipo tikrinimas: typeof, GetType arba is?

Mačiau, kad daugelis žmonių naudoja tokį kodą:

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

Bet aš žinau, kad jūs taip pat galite padaryti taip:

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

Arba taip:

if (obj1 is int)
    // Some code here

Asmeniškai man atrodo, kad pastarasis variantas yra švariausias, bet gal aš ko nors nepastebiu? Kurį iš jų geriausia naudoti, ar tai asmeninis pasirinkimas?

Naudokite typeof, kai norite gauti tipą kompiliavimo metu. Naudokite GetType, kai norite gauti tipą vykdymo metu. Retai pasitaiko atvejų, kai reikia naudoti is, nes jis atlieka kastavimą, o daugeliu atvejų kintamasis vis tiek bus kastruojamas.

Yra ir ketvirta galimybė, kurios nesvarstėte (ypač jei ketinate objektą taip pat kastuoti į rastą tipą); tai yra naudoti as.

Foo foo = obj as Foo;

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

Naudojamas tik vienas kastas, o šis metodas:

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

reikia dviejų metimų.

Komentarai (6)

Manau, kad pastarasis taip pat atsižvelgia į paveldėjimą (pvz., Šuo yra Gyvūnas == true), kuris daugeliu atvejų yra geresnis.

Komentarai (0)

Tai priklauso nuo to, ką darau. Jei man reikia bool reikšmės (tarkime, norint nustatyti, ar ją išverčiu į int), naudosiu is. Jei man iš tikrųjų reikia tipo dėl kokios nors priežasties (tarkime, norint perduoti kitam metodui), naudosiu GetType().

Komentarai (1)