2010-12-27 6 views

Antwort

23

Sie können typeof() nur verwenden, wenn Sie diesen Typ zum Zeitpunkt der Kompilierung kennen und versuchen, das entsprechende Objekt Type zu erhalten. (Obwohl der Typ ein generischer Typparameter sein könnte, z. B. typeof(T) innerhalb einer Klasse mit einem Typparameter T.) Es müssen keine Instanzen dieses Typs verfügbar sein, um typeof zu verwenden. Der Operand für typeof ist immer der Name eines Typs oder Typs. Es kann keine Variable oder ähnliches sein.

Jetzt vergleichen Sie das mit object.GetType(). Das wird den tatsächlichen Typ des Objekts erhalten, an dem es aufgerufen wird. Das bedeutet:

  • Sie brauchen nicht die Art zum Zeitpunkt der Kompilierung kennen (und in der Regel Sie nicht)
  • Sie es tun müssen, eine Instanz des Typs sein (wie sonst Sie haben nichts zu nennen GetType auf)
  • Der tatsächliche Typ muss nicht Ihren Code zugänglich sein - zum Beispiel könnte es sich um eine interne Typ in einer anderen Baugruppe

eine ungerade Punkt sein: GetType geben unerwartete Antworten auf Nullable Werttypen aufgrund der Art, wie Boxen funktioniert. Ein Aufruf an GetType umfasst immer das Einschließen von beliebigen-Werttypen, einschließlich eines Nullable-Werttyps, und der eingerahmte Wert eines Nullable-Werttyps ist entweder ein Nullverweis oder ein Verweis auf eine Instanz eines nicht nullbaren Wertetyps.

7

GetType() arbeitet zur Laufzeit, typeof() ist ein Kompilieroperator.

So

// untested, schematic 
void ShowType(Object x) 
{ 
    Write(x.GetType().Name); // depends on actual type 
    // typeof(x) won't actually compile 
    Write(typeof(x).Name); // always System.Object 
} 

ShowType("test"); 

Wird System.String und System.Object drucken.

Siehe this question für ein besseres Beispiel.

+4

Eigentlich kann 'typeof' nicht mit einer Instanz verwendet werden, daher wird' typeof (x) 'nicht kompiliert. –

+0

@Romain: Du hast Recht, einen Kommentar hinzugefügt. Sie können dies mit einer generischen Methode ähnlich demonstrieren. –

+0

typeof (instance) wird nicht kompiliert, oder? – Gishu

2

GetType ist eine virtuelle Methode für Object - das bedeutet, dass Sie bei einer Instanz einer Klasse das entsprechende Type-Objekt abrufen können.

typeof ist ein C# -Operator - dies wird verwendet, um eine Kompilierzeit-Suche durchzuführen, d. H. Gegeben sei ein Symbol, das einen Klassennamen darstellt, um das Type-Objekt dafür abzurufen.

if (typeof(String) == "test".GetType()) 
0

Es ist nicht genau das gleiche, und das Problem wird angezeigt, wenn Sie Vererbung.

I.e.:

WebPage1 erbt von Page, und dieses erbt auch von Object, wenn Sie also für (new WebPage1()).GetType() == typeof(object) testen werde es falsch zurück, weil die Typen diferent sind, aber wenn Sie testen Sie die is Operator es wahr ist.

((new WebPage1()) is object) ist wahr, weil (new WebPage1()) ist ein Objekt vom Typ WebPage1, und auch ein Page und ein object. Die Typen können unterschiedlich sein, aber is prüft, ob Sie diesen Typ sicher in umwandeln können.

Verwandte Themen