En C #, ¿cómo funciona la palabra clave var?
En C #, ¿cómo funciona la palabra clave var?
Respuestas:
Significa que el compilador inferirá el tipo de local que se declara:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
En particular, varno define una variable como de tipo dinámico. Entonces esto NO es legal:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var tiene solo dos usos:
var foo = new { Bar = "bar" };No se puede usar varcomo el tipo de nada más que locales. Por lo tanto, no puede usar la palabra clave varpara declarar campos / propiedades / parámetros / tipos de retorno.
var foo = new Foo();es lo mismo que Foo foo = new Foo();, lo que significa que foopuede contener una Fooreferencia, o una referencia a un objeto de cualquier Foo subtipo , no un Foo super tipo.
Significa que el tipo de datos se deriva (implícita) del contexto.
De http://msdn.microsoft.com/en-us/library/bb383973.aspx
A partir de Visual C # 3.0, las variables que se declaran en el ámbito del método pueden tener un tipo var implícito. Una variable local implícitamente tipada está fuertemente tipada como si usted mismo hubiera declarado el tipo, pero el compilador determina el tipo. Las siguientes dos declaraciones de i son funcionalmente equivalentes:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var es útil para eliminar la escritura en el teclado y el ruido visual, por ejemplo,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
se convierte en
var x = new MyReallyReallyLongClassName();
pero se puede usar en exceso hasta el punto de sacrificar la legibilidad.
Declara un tipo en función de lo que se le asigna en la inicialización.
Un ejemplo simple es que el código:
var i = 53;
Examinará el tipo de 53 y esencialmente reescribirá esto como:
int i = 53;
Tenga en cuenta que si bien podemos tener:
long i = 53;
Esto no sucederá con var. Aunque puede con:
var i = 53l; // i is now a long
Similar:
var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.
Esto puede ser una comodidad menor con tipos complicados. Es más importante con tipos anónimos:
var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
Console.WriteLine(j.ID.ToString() + ":" + j.Name);
Aquí no hay otra forma de definir iy jusar, varya que no hay nombre para los tipos que contienen.
¿Alguna vez odiaste escribir tales inicializadores de variables?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Entonces, comenzando con C # 3.0, puede reemplazarlo con
var xmlSerializer = new XmlSerialzer(typeof(int))
Un aviso: el tipo se resuelve durante la compilación, por lo que no hay problemas de rendimiento. Pero el compilador debería poder detectar el tipo durante el paso de compilación, por lo que código como var xmlSerializer;no se compilará en absoluto.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var es una "palabra clave contextual" en C #, lo que significa que solo puede usarla como una variable local implícitamente en el contexto de la misma clase que está usando la variable. Si intenta usarlo en una clase a la que llama desde "Main" o alguna otra clase exterior, o una interfaz, por ejemplo, obtendrá el error CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >
Vea los comentarios sobre cuándo puede y cuándo no puede usarlo en la documentación aquí: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -variables-locales # comentarios >
Básicamente, solo debe usar esto cuando declare una variable con un valor implícito como "var myValue =" Este es el valor "; Esto ahorra un poco de tiempo en comparación con decir" cadena ", por ejemplo, pero en mi humilde opinión no es mucho tiempo guardado y pone una restricción a la escalabilidad de su proyecto.
var foo = new Foo(),foopodría ser de tipoFooo cualquiera de sus clases súper. ¿Cómo puede ser eso legal?