Definire esplicitamente i tipi di dati variabili anziché utilizzare la parola chiave "var"? [chiuso]


35

In C #, sono incoraggiato a utilizzare la parola chiave var per tutti gli usi per ogni dichiarazione di variabile? Se sì, devo menzionare quei caratteri speciali per i valori letterali all'interno della dichiarazione della variabile come M per i decimali nella seguente istruzione:

var myDecimal = 14.5M;

Se fa la differenza, sto provando a fare un po 'di sviluppo web con C #.


7
Ha una dozzina di duplicati su SO (dove appartiene IMHO).

1
Le stesse domande arrivano al C ++ con la ripetizione C ++ 0x auto.
— David Thornley,

5
Eric Lippert del team di compilatori C # ha recentemente scritto un
— Tim Goodman,

Ci sono sei miliardi di fanatici di questa domanda.
— DeadMG

@DeadMG che li rende sei miliardi e uno.
— Wassimans,

Risposte:


53

Ci sono state molte controversie sull'uso di var. Le mie regole generali sono le seguenti.

  • Quando il tipo è ovvio, ad esempio quando la mano destra dell'assegnazione è un costruttore, utilizzare var.
  • Quando il tipo è complesso da scrivere, ad esempio una query LINQ (il motivo per cui var è in primo luogo) utilizzare var.
  • Per i tipi ambivalenti (il tuo Decimale è un esempio) in cui vuoi assicurarti che la tua variabile sia digitata correttamente, spiegala.
  • I tipi anonimi devono usare var.
  • In tutti gli altri casi, precisare il tipo.

Fondamentalmente, l'obiettivo è rendere più semplice la lettura del codice. Se ritieni che var sia sufficiente perché l'assegnazione è ovvia, usa var. Usa il nome completo del tipo come suggerimento per il lettore quando ritieni che sia necessario.


9
Uso anche "var" nelle foreachdichiarazioni in cui mi interessa solo enumerare una raccolta, non necessariamente sul tipo di ciascun elemento.
— Adam Lear

1
E come Jesse ha indicato tipi anonimi;)
— Michael Brown,

4
@AnnaLear a volte devi preoccupartene. foreach (var row in datatable.Rows) in questo caso var è un oggetto non un DataRow come ci si aspetterebbe.
— Thanos Papathanasiou,

@ThanosPapathanasiou Certo, sì. Lo stesso vale per la raccolta Controls in Windows Form e probabilmente anche in altre situazioni.
— Adam Lear

Di solito uso var tranne quando voglio essere sicuro del tipo della mia variabile (come quando voglio essere sicuro che il valore sia doppio per esempio)
— eka808

14

Quando usare varè una "guerra santa" di programmazione. Esiste esattamente un posto in cui è richiesto: quando il risultato di un'operazione crea un tipo anonimo, come:

var result = new { Name = "John", Age = 35 };

In qualsiasi altro luogo, è facoltativo e veramente all'altezza del tuo standard di codifica usarlo o meno nelle altre situazioni.

E sì, avrai bisogno dei caratteri speciali per i letterali per far sapere al compilatore di cosa si tratta sul lato destro. Nel tuo esempio, senza il M, il valore predefinito è doublepiuttosto che decimal.


1
dimenticato tutto sui tipi anonimi!
— Michael Brown,

Nel mio ultimo lavoro mi è stato detto che sarei stato licenziato se avessi continuato a usare la parola chiave "var" ...
— Hanzolo,

È estremo, ma l'iniziativa della tua azienda. Sono contento che sia il tuo "ultimo" lavoro, però! :)
— Jesse C. Slicer,

7

Da MSDN :

Tuttavia, l'uso di var ha almeno il potenziale per rendere il tuo codice più difficile da capire per altri sviluppatori. Per questa ragione, la documentazione C # usa generalmente var solo quando è richiesta.

Non mi piace davvero, la digitazione implicita. In superficie tende a rendere il codice più leggibile, ma può portare a molti problemi lungo la strada. Se uno sviluppatore cambia un inizializzatore variabile, diciamo, da

var myFloat=100f;

a

var myFloat=100;

o

var myFloat=100.0;

Il tipo cambierà, causando tutta una serie di errori del compilatore o, se è in una visualizzazione Web e non si sta utilizzando il passaggio post-build per precompilare le visualizzazioni, tutta una serie di errori di runtime che non verranno rilevati senza efficacia test pre-implementazione.

Anche la digitazione implicita non funziona ovunque (dallo stesso collegamento MSDN)

var può essere utilizzato solo quando una variabile locale viene dichiarata e inizializzata nella stessa istruzione; la variabile non può essere inizializzata su null, su un gruppo di metodi o su una funzione anonima.

var non può essere utilizzato su campi nell'ambito della classe.

Le variabili dichiarate utilizzando var non possono essere utilizzate nell'espressione di inizializzazione. In altre parole, questa espressione è legale: int i = (i = 20); ma questa espressione produce un errore in fase di compilazione: var i = (i = 20);

Più variabili tipizzate implicitamente non possono essere inizializzate nella stessa istruzione.

Se un tipo denominato var è nell'ambito, la parola chiave var si risolverà in quel nome di tipo e non verrà trattata come parte di una dichiarazione di variabile locale tipizzata in modo implicito.

Mantenere il codice coerente (in questo caso, usando la digitazione esplicita ovunque) è una cosa molto, molto buona. A mio avviso, varè pigro e non offre alcun vantaggio reale e introduce un altro potenziale punto di errore in un processo già complesso.

Aggiornamento 2017

Ho completamente cambiato idea. Quando lavoro in C #, uso la varmaggior parte del tempo (tranne cose come variabili di tipo interfaccia e simili). Mantiene il codice conciso che migliora la leggibilità. Tuttavia, presta attenzione a ciò che è realmente il tipo risolto.


Mi chiedo cosa ti abbia cambiato idea, @ 3Dave. Sono ancora d'accordo al 100% con il tuo punto originale: "var è pigro e non offre alcun vantaggio reale e introduce un altro potenziale punto di errore in un processo già complesso".
— Dan

@Dan È davvero arrivato alla leggibilità. Uno sviluppatore competente può determinare abbastanza rapidamente cosa c'è sul lato dell'inizializzazione di una dichiarazione senza problemi. Proprio come non usare this.ovunque, o dire System.Blah.SomeTypeinvece di un using, che trovo ancora incredibilmente fastidioso, un codice più conciso è - almeno per me - in genere più facile da analizzare visivamente. Ci sono ancora molti scenari in cui la digitazione esplicita è la scelta giusta. Ma in questi giorni sono meno un avvocato di lingua che qualcuno che sta solo cercando di ottenere un codice pulito fuori dalla porta.
— 3Daveva il

@Dan (Certo, sono anche il tipo che usa i using namespace std;file .cpp. (Non le intestazioni, poiché preferirei evitare di essere catrato e piumato.)
— 3Dave

3

Il riferimento C # mostra quanto segue per illustrare l'uso buono o cattivo di questo costrutto:

L'esempio seguente mostra due espressioni di query. Nella prima espressione, l'uso di var è consentito ma non è richiesto, poiché il tipo del risultato della query può essere dichiarato esplicitamente come IEnumerable. Tuttavia, nella seconda espressione, var deve essere usato perché il risultato è una raccolta di tipi anonimi e il nome di quel tipo non è accessibile se non per il compilatore stesso. Si noti che nell'esempio n. 2, anche l'elemento della variabile iterazione foreach deve essere digitato in modo implicito.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

La parola chiave var richiede solo al compilatore di dedurre automaticamente il tipo della variabile var type. Quindi, se si desidera memorizzare una variabile di tipo decimale in una variabile var, è necessario utilizzare m. Allo stesso modo se stai memorizzando una stringa devi racchiuderla tra virgolette.


0

Per me non uso var per i seguenti casi:

  • Quando voglio essere sicuro del tipo della mia variabile (ad esempio per essere sicuro che il tipo utilizzato sia doppio e non decimale, e questo è un grosso problema, fidati di me!)
  • Codice polimorfico come Fruit foo = new Apple();. In questo caso, penso che var sia da evitare e l'uso della classe genitore (qui Fruit) è migliore consentendo una migliore comprensione della logica del codice e la limitazione dei probabili bug (Con var, nessun controllo del concetto polimorfico!)

Per il resto, penso che dipenda dal caso e dallo sfondo dello sviluppatore. Alcune persone del mondo PHP preferiranno non prendersi cura dei tipi variabili, e alcune persone del mondo Java penseranno semplicemente che var è un'eresia e più è prolisso, meglio è.

Dovrai esprimere la tua opinione personale :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.