Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Perché var sarebbe una cosa negativa?                                      17 risposte                          
  •     
    

Ho appena installato una versione di prova di ReSharper e una delle prime cose che ho notato che suggerisce sempre di sostituire le variabili locali tipizzate in modo esplicito con variabili tipizzate in modo implicito, ad esempio:

public string SomeMethod(int aParam)
{
    int aNumber = SomeOtherMethod(aParam);
    // should be changed to:
    var aNumber = SomeOtherMethod(aParam);
}

Penso che le variabili esplicitamente digitate siano più leggibili (più esplicite).

Cosa pensi del suggerimento di ReSharper? C'è qualche vantaggio nell'usare variabili tipizzate implicitamente? Quando usi i var impliciti / espliciti?

È stato utile?

Soluzione

Personalmente uso solo & # 8220; var & # 8221; quando riesco a distinguere chiaramente il tipo di variabile semplicemente leggendo la dichiarazione, ad esempio:

var someVariable = new List<int>();

Nell'esempio sopra, è evidente che & # 8220; var & # 8221; fa riferimento a & # 8220; Elenco < int > & # 8221 ;.

I don & # 8217; t mi piace usare & # 8220; var & # 8221; quando devo andare ad una definizione del metodo per scoprire quale tipo di variabile & # 8220; var & # 8221; rappresenta o dovendo fare affidamento su Visual Studio Intelli-popup o come viene chiamato, ad esempio questo non va bene per me:

var someVaraible = SomeMethod();

Voglio dire, qual è il & # 8220; SomeMethod & # 8221; funzione dovrebbe tornare? Puoi dirlo guardando la riga di codice? No, puoi & # 8217; t, quindi è per questo che evito di usare & # 8220; var & # 8221; su quelle situazioni.

Altri suggerimenti

Ci sono molte discussioni su questo, ma penso che tutto dipenda da gusti personali, proprio come usare la parola chiave "this" quasi ovunque.

Io personalmente preferisco le variabili tipizzate in modo esplicito, ma quando si usano raccolte generiche nidificate le cose possono diventare più leggibili usando una variabile tipizzata in modo implicito. Guarda:

Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();

vs

var myDictionary = new Dictionary<string, Dictionary<string, string>>();

EDIT: questo argomento SO copre lo stesso argomento, con alcune belle risposte: Cosa usare: var o il tipo di nome oggetto?

EDIT2: lavorando molto con asincrono al giorno d'oggi, trovo che l'uso di variabili tipizzate in modo esplicito possa a volte prevenire bug cattivi. Considera questo esempio stupido in cui vorresti restituire l'ID di un utente. Considera anche che GetUserAsync restituisce Task<User>. Se usi variabili tipizzate in modo implicito, finiresti per usare qualcosa del genere:

public long GetUserId()
{
  var user = GetUserAsync();
  return user.Id;
}

Questo si compila, ma è sbagliato. "user" è in realtà un Task. E si compila come Id ha anche una proprietà await. In questo caso, si restituirebbe per errore l'ID di un'attività anziché l'utente.

public long GetUserId()
{
  User user = GetUserAsync();
  return user.Id;
}

Quanto sopra non viene compilato, poiché il compilatore si lamenterà che non è possibile trasmettere un'attività a un utente. L'aggiunta della <=> parola chiave ovviamente risolve questo.

In realtà questo mi è successo una volta :-)

Nel caso in cui un po 'di paradiso & # 8217; non ancora notato, puoi facilmente cambiare & # 8220; suggerimenti & # 8221; in Reshaper (Reshaper - > Opzioni - > Lingue - > Azioni contestuali - > & # 8220; Sostituisci le specifiche del tipo esplicito con & # 8216; var # 8217 &; & # 8221;).

Personalmente preferisco avere specifiche di tipo esplicite ovunque, ma non sono troppo esigente al riguardo.

A volte è più semplice digitare la pseudo-parola chiave var rispetto a un nome di tipo enorme, soprattutto se potrebbe essere coinvolto un generico. Tuttavia, dovresti sapere che sono funzionalmente identici. Non ci sono differenze di prestazioni o altro. Il compilatore deriva il tipo del lato destro dell'assegnazione e sostituisce var con quel tipo. Non sta accadendo in fase di esecuzione come una variante VB.

FWIW, la parola chiave var è chiaramente leggibile in molti casi. Soprattutto se ...

  1. Il lato destro dell'assegnazione è un'espressione di costruzione.

    var map = new Dictionary > ();

  2. Le variabili locali hanno un buon nome.

HTH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top