2011-09-06 10 views
10

Hace poco vi una persona en gran medida el uso de var y predeterminados palabras clave para la declaración de variables (y para cada declaración), algo como esto:El uso de var y por defecto para la declaración en 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?); 

en lugar de utilizar :

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, en lugar de utilizar incluso:

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

Ahora usando var y por defecto para la declaración de cada variable es algo a lo que no estoy acostumbrado.

Quiere saber:
- Si esta es una práctica recomendada?
- ¿Sus puntos de vista y preferencias?

PS:
- Han pasado por Use of var keyword in C#, Use of "var" type in variable declaration y https://stackoverflow.com/questions/633474/c-do-you-use-var, sin embargo, piensan que esta cuestión, aunque relacionado es ligeramente diferente, ya que es únicamente en torno a la declaración/inicialización y no alrededor de asignación.
- Entiendo la diferencia entre snipped 2 y snippet 3. Sin embargo, la pregunta es más sobre snippet 1.
- Si cree firmemente que esta pregunta pertenece a los programadores stackexchange, siéntase libre de moverse.

+1

Estoy de acuerdo, cualquier cosa que te haga pensar "me pregunto cuál es el valor predeterminado de errorInfo" solo reduce la legibilidad. Especialmente si tienes que salir y buscar en la fuente para averiguarlo. –

+0

@Ben: No entiendo tu comentario. ¿Por qué necesitas cavar? El valor predeterminado para los tipos de referencia siempre es 'null'. –

+0

@Daniel yes pero errorInfo en este ejemplo es una estructura de la que cualquier tipo aleatorio del que nunca hayas oído podría ser a primera vista. –

Respuesta

8

no voy a decir nada acerca de "var" ha habido comentarios acerca de esto en el pasado (lo suficiente como para ;-)

En cuanto a "default()" Yo no usaría esta inicializar un tipo conocido, pero solo en genéricos. Ahí, ayuda a manejar de forma transparente los tipos de valor o tipos de referencia permitiéndole proporcionar un valor predeterminado (de retorno) o puede usarse en las comparaciones.

2

Creo que esta es una mala práctica que evitará que el compilador (y las herramientas de terceros) detecten errores relacionados con la falla al inicializar una variable. En general, trato de mantener la declaración y la asignación lo más cerca posible entre sí. Asignar valores que no están destinados a ser utilizados para variables puede potencialmente introducir errores sutiles que son difíciles de atrapar. Normalmente me había ya sea:

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

o asignar valor requerido de inmediato:

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

o (para mí, con mayor frecuencia hoy en dia)

var variable2 = new SomeType(); 

la asignación de valores nulo/marcador de posición es fundamentalmente inútil .

4

Bueno, la palabra clave default no es la palabra clave más usada en mi opinión, y en mi opinión cumple su función mejor en términos de los genéricos, así:

public class Foo<T>{ 

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

con el fin de obtener un nuevo valor predeterminado instancia de T. Realmente no hay razones para usarlo como escenario 1 en su publicación.

Sin embargo, el uso de var es una pregunta diferente, y muchos lo ven como una cuestión de legibilidad. Yo descuido a var cuando escribo código simplemente porque me resulta más fácil de leer:

var me = new Person(); 

parece un poco redundante en términos de facilidad de lectura que hacer

Person me = new Person(); 

Otro caso recomiendo var es si algo cambios. Consideremos el siguiente ejemplo:

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

Y en otro lugar en el código:

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

Si por alguna razón cambia el tipo de retorno de Calculate a, por ejemplo, double es necesario cambiar todos los lugares donde usted definió fuertemente la variable.

Si en lugar de hacer

var d = Calculate(1M, 2M) 

usted no tiene que preocuparse por esto. El ejemplo Doble/Decimal es un poco simple, pero en términos de refactorizar e interconectar las clases, he encontrado esto muy útil.

0

Utilizo var para la asignación. Sin embargo, siempre declaro instancias usando la clase. Por lo general, también los instauro en el momento para evitar NullReferenceExceptions inesperados

0

El código está bien.

Solo asegúrese de no copiar esta técnica para inicializar enumeraciones donde 0 no es un valor predeterminado o flagged enumeraciones.

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

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