2010-07-10 8 views

Répondre

16

var est juste un raccourci pour "laisser le compilateur choisir le bon type de variable pour moi" (inférence de type à la compilation est le terme le plus exact).

object, d'autre part, est un type spécifique; tous les autres types de référence dérivent de object, donc vous pouvez affecter n'importe quoi à une variable de type object.

+3

Sauf s'il s'agit d'une primitive, auquel cas elle doit être encadrée avant d'être affectée au Référence 'Object'. –

+0

Je pense que quelque chose qui devrait être ajouté à la réponse sélectionnée est que si vous utilisez var alors que @Ben Voigt a dit, vous pouvez faire des choses à l'objet stocké dans var sans avoir à le lancer. – Eric

10

var est la réponse lorsque vous vous posez, dois-je vraiment taper ce nom long de type deux fois, en .: par exemple

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>>>>(); 

Pourquoi pas un ami, vous ne le faites pas. Utilisez var à la place:

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

Maintenant myDict est vraiment un Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>, de sorte que vous pouvez ajouter des choses à elle, l'énumérer, etc.

Si vous déclarez comme object vous ne pouviez pas faire toutes les opérations avec elle qui sont fournis par Dictionary, seulement ceux valables pour tous les objets.

+2

J'aimerais voir ce code en action. –

+0

Votre ordinateur fonctionnant sous Windows? j/k. J'ai inventé ce type particulier mais j'essayais plutôt d'utiliser des types qui pourraient être combinés ensemble. –

+0

@ Joe, je ne voudrais pas ... – 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(); 

Dans le premier exemple, le compilateur sait que foo est une chaîne et ainsi nous pouvons appeler des méthodes de chaîne sur foo.

Dans le deuxième exemple, nous "upcast" la chaîne foo à un objet. Maintenant le compilateur ne sait pas (parce qu'il ne devrait pas savoir!) Que bar est réellement une chaîne, et nous ne pouvons pas appeler des méthodes de chaîne sur bar. Le compilateur n'autorise pas la descente implicite d'un objet (ou d'un type de base) vers un type dérivé (tel que System.String). Sa partie de compiler les règles de sécurité du type de temps.

5

var est encore fortement typé mais avec l'objet vous devrez tout lancer.