Variabili locali tipizzate in modo implicito (Guida per programmatori C#)

Alle variabili locali può essere fornite un "tipo" dedotto di var anziché un tipo esplicito. La parola chiave var indica al compilatore di dedurre il tipo della variabile dall'espressione sul lato destro dell'istruzione di inizializzazione. Il tipo dedotto può essere un tipo incorporato, un tipo anonimo, un tipo definito dall'utente o un tipo definito nella libreria di classi .NET Framework. Per ulteriori informazioni su come inizializzare matrici con var, vedere Matrici tipizzate in modo implicito (Guida per programmatori C#).

Negli esempi seguenti sono illustrati svariati modi con cui le variabili locali possono essere dichiarate 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>();

È importante comprendere che la parola chiave var non significa "variant" e che non indica che la variabile è debolmente tipizzata o è ad associazione tardiva. Significa semplicemente che il compilatore determina e assegna il tipo più adatto.

È possibile utilizzare la parola chiave var nei seguenti contesti:

  • Su variabili locali (variabili dichiarate nell'ambito del metodo) come illustrato nell'esempio precedente.

  • In un'istruzione di inizializzazione for.

    for(var x = 1; x < 10; x++)
    
  • In un'istruzione di inizializzazione foreach.

    foreach(var item in list){...}
    
  • In un'istruzione using.

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

Per ulteriori informazioni, vedere Procedura: utilizzare variabili e matrici locali tipizzate in modo implicito in un'espressione di query (Guida per programmatori C#).

var e tipi anonimi

In molti casi l'utilizzo di var è facoltativo ed è solo una convenzione sintattica. Tuttavia, quando una variabile viene inizializzata con un tipo anonimo è necessario dichiararla come var, se si deve accedere alle proprietà dell'oggetto in un momento successivo. Si tratta di uno scenario comune nelle espressioni di query LINQ. Per ulteriori informazioni, vedere Tipi anonimi (Guida per programmatori C#).

Dalla prospettiva del codice sorgente, un tipo anonimo non dispone di nome. Se una variabile di query è stata inizializzata con var, l’unico modo per accedere alle proprietà nella sequenza di oggetti restituita è utilizzare var come tipo della variabile di iterazione nell’istruzione 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        
 */

Note

Le restrizioni seguenti si applicano alle dichiarazioni di variabili tipizzate in modo implicito:

  • var può essere utilizzata solo quando una variabile locale viene dichiarata e inizializzata nella stessa istruzione. La variabile non può essere inizializzata su null, su un gruppo di metodi o una funzione anonima.

  • Non è possibile utilizzare var nei campi nell'ambito della classe.

  • Le variabili dichiarate utilizzando var non possono essere utilizzate nell'espressione di inizializzazione. In altre parole, questa espressione è valida: int i = (i = 20); ma produce un errore in fase di compilazione: var i = (i = 20);

  • Non è possibile inizializzare più variabili tipizzate in modo implicito nella stessa istruzione.

  • Se un tipo denominato var rientra nell’ambito, la parola chiave var risolverà in tale nome di tipo e non verrà trattata come parte di una dichiarazione di variabile locale tipizzata in modo implicito.

var può inoltre risultare utile con le espressioni di query in cui è difficile determinare con esattezza il tipo costruito della variabile della query, ad esempio con il raggruppamento e l'ordinamento di operazioni.

La parola chiave var può essere utile anche quando il tipo specifico della variabile risulta difficile da digitare con la tastiera, è ovvio o non migliora la leggibilità del codice. var è utile in tal senso ad esempio con i tipi generici annidati, quali quelli utilizzati con le operazioni di gruppo. Nella query seguente, il tipo della variabile della query è IEnumerable<IGrouping<string, Student>>. Purché ciò sia chiaro a tutti coloro che devono gestire il codice, l'utilizzo della tipizzazione implicita per ragioni di praticità e brevità non costituisce un problema.

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

L'utilizzo di var, tuttavia, può quanto meno rendere più difficoltosa la comprensione del codice per gli altri sviluppatori. Nella documentazione di C# var viene pertanto in genere utilizzata solo quando è necessario.

Vedere anche

Attività

Procedura: utilizzare variabili e matrici locali tipizzate in modo implicito in un'espressione di query (Guida per programmatori C#)

Riferimenti

Matrici tipizzate in modo implicito (Guida per programmatori C#)

Tipi anonimi (Guida per programmatori C#)

Inizializzatori di oggetto e di insieme (Guida per programmatori C#)

var (Riferimenti per C#)

for (Riferimenti per C#)

foreach, in (Riferimenti per C#)

Istruzione using (Riferimenti per C#)

Concetti

Espressioni di query LINQ (Guida per programmatori C#)

Altre risorse

Riferimenti per C#

LINQ (Language-Integrated Query)