Variables locales con asignación implícita de tipos (Guía de programación de C#)

Actualización: Julio de 2008

A las variables locales se les puede asignar un "tipo" deducido var en lugar de un tipo explícito. La palabra clave var indica al compilador que deduzca el tipo de la variable a partir de la expresión que se encuentra en el lado derecho de la instrucción de inicialización. El tipo deducido puede ser un tipo integrado, un tipo anónimo, un tipo definido por el usuario o un tipo definido en la biblioteca de clases de .NET Framework. Para obtener más información sobre cómo inicializar matrices con var, vea Matrices con asignación implícita de tipos (Guía de programación de C#).

En los ejemplos siguientes se muestran varias maneras de declarar variables locales con var:

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>                             
var list = new List<int>();

Es importante entender que la palabra clave var no significa "variant" ni indica que la variable tenga establecimiento flexible de tipos ni que sea de enlace en tiempo de ejecución. Simplemente significa que el compilador determina y asigna el tipo más adecuado.

La palabra clave var se puede usar en los siguientes contextos:

  • En variables locales (variables declaradas en el ámbito de método), como se mostraba en el ejemplo anterior.

  • En una instrucción de inicialización for.

    for(var x = 1; x < 10; x++)
    
  • En una instrucción de inicialización foreach.

    foreach(var item in list){...}
    
  • En una instrucción Using.

    using (var file = new StreamReader("C:\\myfile.txt")) {...}
    

Para obtener más información, consulte Cómo: Usar matrices y variables locales con tipo implícito en expresiones de consulta (Guía de programación de C#).

Var y los tipos anónimos

En muchos casos, el uso de var es opcional y es simplemente una comodidad sintáctica. Sin embargo, cuando una variable se inicializa con un tipo anónimo, debe declarar la variable como var si necesita tener acceso a las propiedades del objeto en un punto posterior. Éste es un escenario común en expresiones de consulta LINQ. Para obtener más información, consulte Tipos anónimos (Guía de programación de C#).

Desde la perspectiva del código fuente, un tipo anónimo no tiene nombre. Por tanto, si una variable de consulta se ha inicializado con var, la única manera de tener acceso a las propiedades de la secuencia de objetos devuelta consiste en utilizar var como el tipo de la variable de iteración en la instrucción foreach.

class ImplicitlyTypedLocals2
{
    static void Main()
    {            
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

        // If a query produces a sequence of anonymous types, 
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }        
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry        
 */

Comentarios

Las restricciones siguientes se aplican a las declaraciones de variable con tipo implícito:

  • var solo se puede utilizar cuando una variable local se declara y se inicializa en la misma instrucción; la variable no se puede inicializar como null, como un grupo de métodos ni como una función anónima.

  • var no se puede usar en campos en el ámbito de clase.

  • Las variables declaradas con var no se pueden utilizar en la expresión de inicialización. En otras palabras, esta expresión es legal: int i = (i = 20); pero esta expresión genera un error en tiempo de compilación: var i = (i = 20);

  • No es posible inicializar varias variables con tipo implícito en la misma instrucción.

  • Si un tipo denominado var está dentro del ámbito, la palabra clave var se resolverá como ese nombre de tipo y no se tratará como parte de una declaración de variable local tipificada implícitamente.

Quizás piense que var también puede ser útil con expresiones de consulta en las que es difícil determinar el tipo construido exacto de la variable de consulta. Esto puede suceder en las operaciones de agrupación y ordenación.

La palabra clave var también puede ser útil cuando es incómodo escribir el tipo específico de la variable en el teclado, cuando es obvio o cuando no mejora la legibilidad del código. Un ejemplo de cómo var es útil en este sentido son los tipos genéricos anidados como los que se usan en las operaciones de agrupación. En la consulta siguiente, el tipo de la variable de consulta es IEnumerable<IGrouping<string, Student>>. Siempre y cuando usted y las otras personas que deben mantener el código lo entiendan, no hay ningún problema con el hecho de utilizar tipos implícitos por comodidad y brevedad.

// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
 var studentQuery3 =
     from student in students
     group student by student.Last;

Sin embargo, el uso de var tiene al menos el potencial de dificultar la compresión de su código a otros programadores. Por esa razón, en la documentación de C# generalmente var solo se utiliza cuando es necesario.

Vea también

Tareas

Cómo: Usar matrices y variables locales con tipo implícito en expresiones de consulta (Guía de programación de C#)

Conceptos

Expresiones de consultas con LINQ (Guía de programación de C#)

Referencia

Matrices con asignación implícita de tipos (Guía de programación de C#)

Tipos anónimos (Guía de programación de C#)

Inicializadores de objeto y de colección (Guía de programación de C#)

var (Referencia de C#)

for (Referencia de C#)

foreach, in (Referencia de C#)

using (Instrucción, Referencia de C#)

Otros recursos

Referencia de C#

Language-Integrated Query (LINQ)

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se han corregido declaraciones relacionadas con el hecho de que se requiere var al inicializar los tipos anónimos. De hecho, solo se requiere si desea tener acceso posteriormente a las propiedades de dichos objetos.

Corrección de errores de contenido.