2010-06-30 29 views
7

Etwas, über das ich von Zeit zu Zeit nachgedacht habe: Warum wird der Typ des Operators in C# benötigt? Weiß der Compiler nicht, dass public class Animal ein Typ nur nach der Definition ist? Warum muss ich SomeMethod(typeof(Animal)) angeben, wenn ich auf einen Typ verweisen muss?Warum wird typeof benötigt?

Antwort

4

typeof(Class) ist die einzige Möglichkeit, Typ als Literal auszudrücken. Wenn Sie Class.SomeField schreiben, meinen Sie ein statisches Feld. Wenn Sie typeof(Class).SomeField schreiben, verweisen Sie auf das Feld des Objekts der Klasse Type, das Ihre Klasse darstellt.

+1

Ja, aber die Frage ist: warum? –

+0

@Daniel Earwicker warum? um statische Mitglieder und Typmitglieder zu unterscheiden. – Andrey

+0

Ah, ich verstehe diesen Teil der Antwort, oh! +1 –

1

Reflexion für Vorspeisen. Viele Möglichkeiten werden verfügbar, wenn Sie den Typ selbst überprüfen können, anstatt nur wissen zu müssen, was er darstellt oder überhaupt existiert.

6

Animal ist einfach der Name des Typs, typeof(Animal) gibt den tatsächlichen Typ Objekt (System.Type Instanz) zurück. Sicher, möglicherweise war es nur möglich, dass der Typname das Typobjekt im Code zurückgibt, aber es macht den Job für den Compiler/Parser schwieriger (erkennt, wenn ein Typname typeof oder etwas anderes bedeutet) - daher die Existenz von das Schlüsselwort typeof. Es macht auch den Code klarer zu lesen.

+2

Sie können auch Eigenschaften wie Typen benennen (üblich für Dinge wie 'Farbe' oder so), die dann noch mehr verwirren können. – Joey

+0

In der Tat ... es fragt den Compiler, wirklich clever zu sein, um den Code marginal zu verkürzen. – Noldorin

+0

Ich glaube, das Wort, nach dem wir suchen, ist 'Ambiguität'. Es gibt Fälle, in denen 'someVariable.GetType() == Animal' mehrdeutig sein kann. Ist 'Animal' im vorhergehenden Snippet eine Klassendefinition oder ein Member? Wenn "typeof" nicht verwendet wird, muss "Animal" * ein Mitglied sein. Wenn 'typeof' verwendet wird, muss 'Animal' * * eine Klassendefinition sein. –

0

typeof() ermöglicht es mir, eine Instanz eines Type-Objekts abzurufen, ohne dass eine Instanz des Zielobjekts vorhanden sein muss. Dies wiederum lässt mich Fragen über die Klasse stellen, ohne eine Instanz davon zu haben.

0

Nun, wie erhalten Sie den System.Type einer Klasse, ohne zuerst die Klasse zu instanziieren, wenn Sie nicht den Typoperator verwenden? Einfach, das geht nicht: D

Da Sie mit nur einem System.Type viel Reflektionsmaterial machen können, ist dieser Operator sehr praktisch.

3

Nicht mit typeof verursacht Mehrdeutigkeit:

class foo 
{ 
    public static string ToString() 
    { 
     return "Static"; 
    } 
} 
public class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(foo.ToString()); 
     Console.WriteLine(typeof(foo).ToString()); 
    } 
} 

foo und typeof(foo) beziehen sich nicht auf die gleiche Sache, und zwingt den Compiler so zu tun, sie sind eine schlechte Idee ist, auch wenn wir diese Mehrdeutigkeit zu ignorieren.