2011-09-06 11 views
10

Recentemente ho visto una persona pesantemente utilizzando var e di default le parole chiave per la dichiarazione delle variabili (e per ogni dichiarazione), qualcosa di simile:L'uso del Var e di default per la dichiarazione in C#

var employee = default(Employee); //Employee is a class 
var errorInfo = default(ErrorInfo); //ErrorInfo is struct; Blank is default value 
var salary = default(Double); 
var isManager = default(Boolean?); 

invece di utilizzare :

Employee employee = null;   //Employee is a class 
ErrorInfo errorInfo = Blank;  //ErrorInfo is struct; Blank is default value 
Double salary = 0.0; 
Boolean? isManager = null; 

o, invece di utilizzare anche:

Employee employee;     //Employee is a class 
ErrorInfo errorInfo;    //ErrorInfo is struct; Blank is default value 
Double salary; 
Boolean? isManager; 

ora utilizzando var e di default per la dichiarazione per ogni variabile è qualcosa che non sono abituato a.

Vuoi sapere:
- Se questa è una pratica consigliata?
- Le vostre opinioni e preferenze?

PS:
- sono passati attraverso Use of var keyword in C#, Use of "var" type in variable declaration e https://stackoverflow.com/questions/633474/c-do-you-use-var, tuttavia, pensare che questa domanda, anche se relativo è leggermente diverso in quanto è solo intorno dichiarazione/inizializzazione e non intorno assegnazione.
- Capisco la differenza tra snippet 2 e snippet 3. Tuttavia, la domanda è più in giro snippet 1.
- Se si sente fortemente che questa domanda appartiene ai programmatori stackexchange sentitevi liberi di muoversi.

+1

Sono d'accordo, tutto ciò che ti fa pensare "mi chiedo quale sia il valore predefinito di errorInfo" riduce semplicemente la leggibilità. Soprattutto se devi andare a scavare nella fonte per scoprirlo. –

+0

@ Ben: non capisco il tuo commento. Perché hai bisogno di scavare? Il valore predefinito per i tipi di riferimento è sempre 'null'. –

+0

@Daniel yes ma errorInfo in questo esempio è una struttura che qualsiasi tipo casuale di cui non hai mai sentito parlare potrebbe essere a prima vista. –

risposta

8

io non ho intenzione di dire nulla "var" non ci sono stati commenti e discussioni su questo in passato (in modo sufficiente ;-)

Per quanto riguarda "default()" Non vorrei usare questo per inizializzare a noto come tipo, ma piuttosto solo in generici. In questo modo è possibile gestire in modo trasparente tipi di valori o tipi di riferimento consentendo di fornire un valore predefinito (restituito) o può essere utilizzato nei confronti.

2

Penso che questa sia una cattiva pratica che impedirà al compilatore (e agli strumenti di terze parti) di intercettare errori relativi all'inizializzazione di una variabile. In generale cerco di mantenere la dichiarazione e l'assegnazione il più vicino possibile l'una all'altra. Assegnare valori che non devono essere usati per le variabili può potenzialmente introdurre bug sottili che sono difficili da individuare. Normalmente avevo uno:

SomeType variable1; //want to store something that will be out of scope later 
using(blah) 
{ 
    //... 
    variable1=blah; 
} 
//use variable1 here 

o assegnare valore richiesto immediatamente:

SomeType variable2 = new SomeType(); 
//use variable2 immediately 

o (per me, più frequentemente oggigiorno)

var variable2 = new SomeType(); 

assegnazione di valori nulli/placeholder è principalmente inutile .

4

Beh, la parola chiave default non è la parola più usata credo, e secondo me il suo scopo meglio in termini di Generics, in questo modo:

public class Foo<T>{ 

    private T _instance; 
    public Foo<T>(){ 
     _instance = default(T); 
    } 
} 

al fine di ottenere una nuova impostazione predefinita istanza di T. Non ci sono davvero motivi per usarlo come scenario 1 nel tuo post.

Utilizzare var tuttavia è una domanda diversa, e molti la considerano come una questione di leggibilità. Ho Default per var quando scrivo il codice semplicemente perché lo trovo più facile da leggere:

var me = new Person(); 

sembra un po 'ridondante, in termini di leggibilità fare

Person me = new Person(); 

Un altro caso vi consiglio var è se qualcosa i cambiamenti. Si consideri il seguente esempio:

public decimal Calculate(decimal one, decimal two){ 
    return one + two; 
} 

E da qualche altra parte nel codice:

decimal d = Calculate(1M, 2M); 

Se per qualche motivo di cambiare il tipo di ritorno di Calculate, per dire, double è necessario modificare tutti i luoghi dove hai fortemente definito la variabile.

Se invece fai

var d = Calculate(1M, 2M) 

non dovete preoccuparvi di questo. L'esempio Double/Decimal è un po 'semplice, ma in termini di refactoring e di interfaccia con le classi, ho trovato questo molto utile.

0

Uso var per l'assegnazione. Tuttavia dichiaro sempre le istanze che usano la classe. Generalmente li istanziamo anche al momento per evitare impreviste NullReferenceExceptions

0

Il codice è ok.

Accertarsi semplicemente di non copiare questa tecnica per inizializzare le enumerazioni in cui 0 non è un valore predefinito o enumerazioni flagged.

[Flags] 
public enum MyFlags 
{ 
    Test = 1, 
    Test2 = 2 
} 

MyFlags flags = default(MyFlags); 
Console.WriteLine(flags); // oops