2010-07-10 15 views

risposta

16

var è semplicemente una scorciatoia per "lasciare che il compilatore scelga il tipo di variabile corretto per me" (l'inferenza di tipo in fase di compilazione è il termine più esatto).

object, d'altra parte, è un tipo specifico; tutti gli altri tipi di riferimento derivano da object, quindi è possibile assegnare qualsiasi elemento a una variabile di tipo object.

+3

A meno che non sia un primitivo, nel qual caso deve essere inserito prima di essere assegnato al 'Oggetto' riferimento. –

+0

Penso che qualcosa che dovrebbe essere aggiunto alla risposta selezionata sia che se usi var allora come @Ben Voigt ha detto, puoi fare cose sull'oggetto memorizzato in var senza doverlo lanciare. – Eric

10

var è la risposta quando ti ritrovi a chiedere, ne ho veramente necessario digitare nome del tipo di quella lunga due volte, nel es .:

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

Perché non è amico, non è vero. Utilizzare var invece:

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

Ora myDict è davvero un Dictionary<string, Func<List<Func<int, int, double>>, IEnumerable<Tuple<double, string>>>>, in modo da poter aggiungere le cose ad esso, enumerare esso, ecc

Se ha dichiarato come object non si poteva fare qualsiasi operazione con esso che sono forniti da Dictionary, solo quelli validi per tutti gli oggetti.

+2

Mi piacerebbe vedere quel codice in azione. –

+0

Il tuo computer con Windows? j/k. Ho inventato quel tipo particolare ma stavo provando abbastanza duramente ad usare i tipi che potrebbero realmente essere uniti insieme. –

+0

@Joe, non vorrei ... – 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(); 

Nel primo esempio, il compilatore sa che foo è una stringa e così può chiamare metodi delle stringhe sulla foo.

Nel secondo esempio, abbiamo "trasmesso" la stringa foo a un oggetto. Ora il compilatore non sa (perché non dovrebbe sapere!) Che bar è in realtà una stringa e non possiamo chiamare i metodi stringa su bar. Il compilatore non consentirà il downcast implicito da un oggetto (o qualsiasi tipo di base) a un tipo derivato (come System.String). Fa parte delle regole di sicurezza del tipo a tempo di compilazione.

5

var è ancora fortemente digitato ma con l'oggetto è necessario eseguire il cast di tutto.