¿Qué significa "var" en C #? [duplicar]

Respuestas:

159

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:

  1. Requiere menos escritura para declarar variables, especialmente cuando se declara una variable como un tipo genérico anidado.
  2. Debe utilizarse cuando se almacena una referencia a un objeto de tipo anónimo, porque el nombre del tipo no se puede conocer de antemano: 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.

cdhowie
fuente
@cdhowie ¿Y si mientras diciendo var foo = new Foo(), foopodría ser de tipo Fooo cualquiera de sus clases súper. ¿Cómo puede ser eso legal?
John Strood
3
@Djack No es legal, y ese no es el caso. 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.
cdhowie
15

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.

RedFilter
fuente
9

"var" significa que el compilador determinará el tipo explícito de la variable, según el uso. Por ejemplo,

var myVar = new Connection();

le daría una variable de tipo Conexión.

aaaa bbbb
fuente
7

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.

Jon Hanna
fuente
5

¿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.

El mas pequeño
fuente
0
  • Como sugiere el nombre, var es variable sin ningún tipo de datos.
  • Si no sabe qué tipo de datos devolverá algún método, estos casos son buenos para usar var.
  • var es un tipo implícito, lo que significa que el sistema definirá el tipo de datos en sí. El compilador inferirá su tipo basándose en el valor a la derecha del operador "=".
  • int / string, etc.son los tipos explícitos que usted define explícitamente.
  • Var solo se puede definir en un método como una variable local
  • No se pueden declarar e inicializar varias variables en una sola declaración. Por ejemplo, var i = 1, j = 2; no es válido.
int i = 100;// explicitly typed 
var j = 100; // implicitly typed
Vivek Redhu
fuente
0

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.

Lundeen.Bryan
fuente