pátek 17. června 2011

typeof vs GetType

Jaký je rozdíl mezi použitím typeof a object.GetType()?
Rychlé shrnutí toho, co můžete najít na internetových diskusích.


  • Statická metoda (ve skutečnosti operátor), které musíte zadat známý typ třídy.
  • Provedeno při kompilaci.
  • Z předchozí poznámky plyne, že typ (zadané třídy) musí být definován buď v aktuální assembly nebo v assembly, která je referencovaná z aktuální.
  • Nemůže být přetížen.
  • Slouží k získání typu známé třídy.
  • Volání provedeno při běhu programu.
  • Musíme mít instanci objektu, jehož typ chceme získat.
  • Slouží pro získání neznámého typu objektu.
  • Pomalejší než typeof.
  • Vrací základní typ objektu, který se může lišit od typu objektu, který na něj odkazuje:
class BazovaTrida {}

class OdvozenaTrida: BazovaTrida {}

class Priklad
{
static void VratTyp(BazovaTrida b)
{
Console.WriteLine(typeof(BazovaTrida));
Console.WriteLine(b.GetType());
}

static void Main()
{
VratTyp(new OdvozenaTrida());
}
}
Dostaneme tento výstup:
BazovaTrida
OdvozenaTrida
První řádek není nijak překvapivý. Ale u druhého řádku se na chvíli zastavíme. Metodě VratTyp předáváme jako argument objekt typu OdvozenaTrida. Uvnitř metody VratTyp na druhém řádku voláme GetType na objektu typu BazovaTrida. A dostávámé jako výsledek typ Odvozená třída. Takže dostáváme jako výsledek skutečný typ (OdvozenaTrida) a ne typ objektu, který na něj odkazuje.¨

  • Slouží k získání typu, ke kterému nemáme z aktuální assembly přístup, za předpokladu, že známe celý název typu včetně assembly, ve které je definován.
  • Pouze pro assembly, které jsou nahrány z disku (tzn. ne pro dynamicky nahráté assembly).
  • Voláno za běhu programu.
  • Pokud je voláno s názvem typu bez udání assembly, vyhledává pouze v aktuální assembly a v mscorlib.dll.
Zdroje:


Žádné komentáře:

Okomentovat