2010-07-10 14 views

Antwort

16

var ist nur Kurzform für "lassen Sie den Compiler den richtigen Variablentyp für mich auswählen" (Kompilierungszeit Typ-Inferenz ist der genauere Begriff).

object, auf der anderen Seite ist ein bestimmter Typ; Alle anderen Referenztypen stammen von object, sodass Sie einer Variablen vom Typ object alles zuweisen können.

+3

Es sei denn, es ist ein primitiv, in diesem Fall muss es eingerahmt werden, bevor in die zugewiesen wird Referenz "Objekt". –

+0

Ich denke, etwas, das zu der ausgewählten Antwort hinzugefügt werden sollte, ist, dass, wenn Sie var dann wie @Ben Voigt gesagt, können Sie Dinge zu dem Objekt in var gespeichert tun, ohne dass es zu werfen. – Eric

10

var ist die Antwort, wenn Sie sich fragen, finden Sie geben diesen Namen lange Typ zweimal, muss ich wirklich in z.B .:

Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>> myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>(); 

Warum kein Freund, du nicht. Verwenden Sie var statt:

var myDict = new Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>(); 

Jetzt myDict wirklich ein Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>> ist, so dass Sie Dinge hinzufügen können, aufzählen es usw.

Wenn Sie es als object erklärt Sie keine Operationen mit ihm tun könnte Diese werden von Dictionary zur Verfügung gestellt, nur die für alle Objekte gültigen.

+2

Ich würde gerne diesen Code in Aktion sehen. –

+0

Ihr Computer mit Windows? j/k. Ich habe diesen speziellen Typ erfunden, aber ich habe mich ziemlich bemüht, Typen zu verwenden, die tatsächlich miteinander kombiniert werden könnten. –

+0

@Joe, würde ich nicht ... – jonnystoten

4
var foo = "Hello, I am a string!"; 
// foo is a string, so this compiles 
var fooCharArray = foo.ToCharArray(); 

object bar = foo; 
// bar is not a string, so this does not compile 
var barCharArray = bar.ToCharArray(); 

Im ersten Beispiel weiß der Compiler, dass foo ein String ist und so können wir String-Methoden auf foo nennen.

Im zweiten Beispiel "upcast" wir die Zeichenfolge foo an ein Objekt. Jetzt weiß der Compiler nicht (weil es nicht wissen sollte!), Dass bar tatsächlich eine Zeichenfolge ist, und wir können String-Methoden unter bar nicht aufrufen. Der Compiler lässt das implizite Downcasting von einem Objekt (oder einem Basistyp) in einen abgeleiteten Typ (wie System.String) nicht zu. Teil der Kompilierzeit Typ Sicherheitsregeln.

5

var ist immer noch stark typisiert, aber mit Objekt müssen Sie alles werfen.