Vantaggio della parola chiave var in C # 3.0

Duplicare:

Cosa usare var o tipo di nome object

Non riuscivo a capire la necessità della parola chiave var in C # 3.0 Qual è il vantaggio nell’utilizzarlo. ho visto questa domanda ma non ho capito il vero scopo di usarla

È principalmente presente per LINQ, quando puoi utilizzare un tipo anonimo come proiezione:

 var query = from person in employees where person.Salary > 10000m select new { FullName=person.Name, person.Department }; 

Qui il tipo di query non può essere dichiarato esplicitamente, perché il tipo anonimo non ha nome. (Nei casi reali, il tipo anonimo spesso include valori di più oggetti, quindi non esiste una class denominata che contenga tutte le proprietà.)

È anche praticamente utile quando si inizializza una variabile utilizzando un nome di tipo potenzialmente lungo (solitamente a causa di generici) e semplicemente chiamando un costruttore – aumenta la densità delle informazioni (riduce la ridondanza). C’è la stessa quantità di informazioni in queste due righe:

 List> functions = new List>(); var functions = new List>(); 

ma il secondo lo esprime in un modo più compatto.

Naturalmente questo può essere abusato, ad es

 var nonObviousType = 999999999; 

ma quando è ovvio qual è la variabile del tipo, credo che possa aumentare significativamente la leggibilità.

La ragione principale della sua esistenza è l’introduzione di tipi anonimi in C #. Puoi build tipi al volo che non hanno un nome. Come specificheresti il ​​loro nome? La risposta: non puoi. Devi solo dire al compilatore di dedurli per te:

 var user = users.Where(u=> u.Name == "Mehrdad") .Select(u => new { u.Name, u.Password }); 

È un modo stenografico per dichiarare una var. Sebbene “int i = new int ()” non sia troppo da scrivere, quando inizi a ottenere tipi più lunghi, ti ritroverai con un sacco di linee che assomigliano a:

 SomeReallyLong.TypeName.WithNameSpaces.AndEverything myVar = new SomeReallyLong.TypeName.WithNameSpaces.AndEverything(); 

Alla fine qualcuno si è reso conto che il compilatore sapeva già quale tipo stavi dichiarando grazie alle informazioni che stavi usando per inizializzare la var, quindi non sarebbe troppo chiedere al compilatore di fare la cosa giusta qui.

Ecco alcuni vantaggi

  1. Meno digitando senza perdita di funzionalità
  2. Aumenta il tipo di sicurezza del tuo codice. Un ciclo foreach che utilizza una variabile di iterazione che viene digitata in var catturerà in modo silenzioso i cast introdotti con tipi espliciti
  3. Fa in modo che tu non debba scrivere lo stesso nome due volte in una dichiarazione di variabile.
  4. Alcune funzionalità, come la dichiarazione di una variabile locale di tipo anonimo fortemente tipizzata, richiedono l’uso di var

Autopromozione spudorata. Ho scritto un post sul blog su questo argomento da un po ‘di tempo che mi è successo quando ho pensato che l’uso di var fosse appropriato e contenesse informazioni relative a questo argomento.

  • Le espressioni Linq non restituiscono un tipo predefinito, quindi è necessaria una parola chiave di dichiarazione di variabile “generica” ​​per acquisire tale e altri luoghi in cui vengono utilizzati i tipi anonimi.
  • Usato con attenzione, può semplificare il refactoring disaccoppiando il tipo di ritorno di un metodo dalla variabile che lo cattura.
  • Dover mettere lo stesso nome sulla stessa linea due volte per la stessa affermazione è davvero un po ‘sciocco. È difficile scrivere qualcosa come questo:

.

 ReallyLongTypeName MyVariable = new ReallyLongTypeName(); 

In breve:

  1. minimizzare la necessità di digitare due volte il tipo di variabile
  2. essenziale nel supporto di tipi anonimi, ad esempio come restituiti da query LINQ

La vera necessità della parola chiave var era di supportare i tipi anonimi in C # 3.0, che a loro volta erano necessari per supportare correttamente LiNQ (Language Integrated Querying).

Senza usare var non potresti mai fare qualcosa del genere:

  var person = new { Name = "Peter", Age=4}; 

Ciò significa che non è ansible eseguire la seguente query linq perché non si sa come assegnarlo a una variabile:

 [var/sometype] dogsFixedQuery = from myDog in kennel select new {dogName = myDog.FirstName + " " + myDog.OwnerLastName, myDog.IsNeutered, dogLocation = kennel.Address}; 

L’utilità dei tipi anonimi sarà più evidente se inizi a creare query linq più complesse con più livelli di resi e join.

Il fatto che sia ansible utilizzare var in altri modi per evitare di digitare qualcosa come IEnumerable,IOrderedCollection> myBadDesign = getBadDesignController().BadDesignResults("shoppingCart"); è solo un effetto collaterale / bonus nel caso tu sia un pigro typer =)

Ci sono contro per la leggibilità se si inizia a chiamare vars in posizioni disparate, ma se si utilizza var per un tipo forte e il compilatore può determinare il tipo della variabile di qualsiasi lettore dovrebbe essere in grado di determinarlo.