Variáveis locais de tipo implícito (Guia de Programação em C#)Implicitly typed local variables (C# Programming Guide)

Variáveis locais podem ser declaradas sem fornecer um tipo explícito.Local variables can be declared without giving an explicit type. A palavra-chave var instrui o compilador a inferir o tipo da variável da expressão no lado direito da instrução de inicialização.The var keyword instructs the compiler to infer the type of the variable from the expression on the right side of the initialization statement. O tipo inferido pode ser um tipo interno, um tipo anônimo, um tipo definido pelo usuário ou um tipo definido na biblioteca de classes do .NET.The inferred type may be a built-in type, an anonymous type, a user-defined type, or a type defined in the .NET class library. Para obter mais informações sobre como inicializar matrizes com var, consulte Matrizes de tipo implícito.For more information about how to initialize arrays with var, see Implicitly Typed Arrays.

Os exemplos a seguir mostram várias maneiras em que as variáveis locais podem ser declaradas com var:The following examples show various ways in which local variables can be declared with 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>();

É importante entender que a palavra-chave var não significa "variante" e não indica que a variável é vagamente tipada ou de associação tardia.It is important to understand that the var keyword does not mean "variant" and does not indicate that the variable is loosely typed, or late-bound. Isso apenas significa que o compilador determina e atribui o tipo mais apropriado.It just means that the compiler determines and assigns the most appropriate type.

A palavra-chave var pode ser usada nos seguintes contextos:The var keyword may be used in the following contexts:

  • Em variáveis locais (variáveis declaradas no escopo do método) conforme mostrado no exemplo anterior.On local variables (variables declared at method scope) as shown in the previous example.

  • Em uma instrução de inicialização for.In a for initialization statement.

    for (var x = 1; x < 10; x++)
    
  • Em uma instrução de inicialização foreach.In a foreach initialization statement.

    foreach (var item in list) {...}
    
  • Em uma instrução using.In a using statement.

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

Para obter mais informações, consulte como usar variáveis locais e matrizes de tipo implícito em uma expressão de consulta.For more information, see How to use implicitly typed local variables and arrays in a query expression.

Tipos var e anônimosvar and anonymous types

Em muitos casos, o uso de var é opcional e é apenas uma conveniência sintática.In many cases the use of var is optional and is just a syntactic convenience. No entanto, quando uma variável é inicializada com um tipo anônimo você deve declarar a variável como var se precisar acessar as propriedades do objeto em um momento posterior.However, when a variable is initialized with an anonymous type you must declare the variable as var if you need to access the properties of the object at a later point. Esse é um cenário comum em expressões de consulta LINQ.This is a common scenario in LINQ query expressions. Para obter mais informações, consulte Tipos Anônimos.For more information, see Anonymous Types.

Da perspectiva do código-fonte, um tipo anônimo não tem nome.From the perspective of your source code, an anonymous type has no name. Portanto, se uma variável de consulta tiver sido inicializada com var, a única maneira de acessar as propriedades na sequência retornada será usar var como o tipo da variável de iteração na instrução foreach.Therefore, if a query variable has been initialized with var, then the only way to access the properties in the returned sequence of objects is to use var as the type of the iteration variable in the foreach statement.

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
 */

ComentáriosRemarks

As seguintes restrições se aplicam às declarações de variável de tipo implícito:The following restrictions apply to implicitly-typed variable declarations:

  • var pode ser usado apenas quando uma variável local é declarada e inicializada na mesma instrução, a variável não pode ser inicializada como nula, um grupo de métodos ou uma função anônima.var can only be used when a local variable is declared and initialized in the same statement; the variable cannot be initialized to null, or to a method group or an anonymous function.

  • var não pode ser usado em campos no escopo da classe.var cannot be used on fields at class scope.

  • Variáveis declaradas usando var não podem ser usadas na expressão de inicialização.Variables declared by using var cannot be used in the initialization expression. Em outras palavras, essa expressão é válida: int i = (i = 20); mas essa expressão produz um erro de tempo de compilação:var i = (i = 20);In other words, this expression is legal: int i = (i = 20); but this expression produces a compile-time error: var i = (i = 20);

  • Diversas variáveis de tipo implícito não podem ser inicializadas na mesma instrução.Multiple implicitly-typed variables cannot be initialized in the same statement.

  • Se um tipo nomeado var estiver no escopo, a palavra-chave var será resolvida para esse nome de tipo e não será tratada como parte de uma declaração de variável local de tipo implícito.If a type named var is in scope, then the var keyword will resolve to that type name and will not be treated as part of an implicitly typed local variable declaration.

Tipagem implícita com a palavra-chave var só pode ser aplicada às variáveis no escopo do método local.Implicit typing with the var keyword can only be applied to variables at local method scope. Digitação implícita não está disponível para os campos de classe, uma vez que o compilador C# encontraria um paradoxo lógico ao processar o código: o compilador precisa saber o tipo do campo, mas não é possível determinar o tipo até que a expressão de atribuição seja analisada. A expressão não pode ser avaliada sem saber o tipo.Implicit typing is not available for class fields as the C# compiler would encounter a logical paradox as it processed the code: the compiler needs to know the type of the field, but it cannot determine the type until the assignment expression is analyzed, and the expression cannot be evaluated without knowing the type. Considere o seguinte código:Consider the following code:

private var bookTitles;

bookTitles é um campo de classe dado o tipo var.bookTitles is a class field given the type var. Como o campo não tem nenhuma expressão para avaliar, é impossível para o compilador inferir que tipo bookTitles deveria ser.As the field has no expression to evaluate, it is impossible for the compiler to infer what type bookTitles is supposed to be. Além disso, também é insuficiente adicionar uma expressão ao campo (como você faria para uma variável local):In addition, adding an expression to the field (like you would for a local variable) is also insufficient:

private var bookTitles = new List<string>();

Quando o compilador encontra campos durante a compilação de código, ele registra cada tipo de campo antes de processar quaisquer expressões associadas.When the compiler encounters fields during code compilation, it records each field's type before processing any expressions associated with it. O compilador encontra o mesmo paradoxo ao tentar analisar bookTitles: ele precisa saber o tipo do campo, mas o compilador normalmente determinaria o tipo de var analisando a expressão, o que não possível sem saber o tipo com antecedência.The compiler encounters the same paradox trying to parse bookTitles: it needs to know the type of the field, but the compiler would normally determine var's type by analyzing the expression, which isn't possible without knowing the type beforehand.

Você pode descobrir que var também pode ser útil com expressões de consulta em que o tipo construído exato da variável de consulta é difícil de ser determinado.You may find that var can also be useful with query expressions in which the exact constructed type of the query variable is difficult to determine. Isso pode ocorrer com operações de agrupamento e classificação.This can occur with grouping and ordering operations.

A palavra-chave var também pode ser útil quando o tipo específico da variável é enfadonho de digitar no teclado, é óbvio ou não acrescenta à legibilidade do código.The var keyword can also be useful when the specific type of the variable is tedious to type on the keyboard, or is obvious, or does not add to the readability of the code. Um exemplo em que var é útil dessa maneira é com os tipos genéricos aninhados, como os usados com operações de grupo.One example where var is helpful in this manner is with nested generic types such as those used with group operations. Na consulta a seguir, o tipo da variável de consulta é IEnumerable<IGrouping<string, Student>>.In the following query, the type of the query variable is IEnumerable<IGrouping<string, Student>>. Contanto que você e as outras pessoas que devem manter o código entendam isso, não há problema em usar a tipagem implícita por questões de conveniência e brevidade.As long as you and others who must maintain your code understand this, there is no problem with using implicit typing for convenience and brevity.

// 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;

O uso de var ajuda a simplificar seu código, mas seu uso deve ser restrito a casos em que é necessário, ou quando torna seu código mais fácil de ler.The use of var helps simplify your code, but its use should be restricted to cases where it is required, or when it makes your code easier to read. Para obter mais informações sobre quando usar var corretamente, consulte a seção variáveis locais digitadas implicitamente no artigo diretrizes de codificação em C#.For more information about when to use var properly, see the Implicitly typed local variables section on the C# Coding Guidelines article.

Veja tambémSee also