Niejawnie wpisane zmienne lokalne (Przewodnik programowania w języku C#)

Zmienne lokalne można zadeklarować bez podawania jawnego typu. Słowo var kluczowe instruuje kompilator, aby wywnioskował typ zmiennej z wyrażenia po prawej stronie instrukcji inicjowania. Wywnioskowany typ może być wbudowanym typem, typem anonimowym, typem zdefiniowanym przez użytkownika lub typem zdefiniowanym w bibliotece klas platformy .NET. Aby uzyskać więcej informacji na temat inicjowania tablic za pomocą varprogramu , zobacz Niejawnie wpisane tablice.

W poniższych przykładach pokazano różne sposoby deklarowanego zmiennych lokalnych za pomocą polecenia 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>();

Ważne jest, aby zrozumieć, że var słowo kluczowe nie oznacza "wariantu" i nie wskazuje, że zmienna jest luźno typowana lub powiązana z opóźnieniem. Oznacza to tylko, że kompilator określa i przypisuje najbardziej odpowiedni typ.

Słowo var kluczowe może być używane w następujących kontekstach:

  • W zmiennych lokalnych (zmiennych zadeklarowanych w zakresie metody), jak pokazano w poprzednim przykładzie.

  • W instrukcji for initialization.

    for (var x = 1; x < 10; x++)
    
  • W instrukcji inicjowania foreach .

    foreach (var item in list) {...}
    
  • W instrukcji using .

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

Aby uzyskać więcej informacji, zobacz How to use implicitly typed local variables and arrays in a query expression (Jak używać niejawnie wpisanych zmiennych lokalnych i tablic w wyrażeniu zapytania).

typy var i anonimowe

W wielu przypadkach użycie elementu var jest opcjonalne i jest tylko wygodą składniową. Jeśli jednak zmienna jest inicjowana przy użyciu typu anonimowego, musisz zadeklarować zmienną tak, jakby var trzeba było uzyskać dostęp do właściwości obiektu w późniejszym momencie. Jest to typowy scenariusz w wyrażeniach zapytań LINQ. Aby uzyskać więcej informacji, zobacz Typy anonimowe.

Z perspektywy kodu źródłowego typ anonimowy nie ma nazwy. W związku z tym, jeśli zmienna kwerendy została zainicjowana za varpomocą metody , jedynym sposobem uzyskania dostępu do właściwości w zwróconej sekwencji obiektów jest użycie var jako typu zmiennej iteracji w instrukcji 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
 */

Uwagi

Następujące ograniczenia dotyczą niejawnie typizowanej deklaracji zmiennych:

  • var można używać tylko wtedy, gdy zmienna lokalna jest zadeklarowana i zainicjowana w tej samej instrukcji; nie można zainicjować zmiennej na wartość null ani do grupy metod lub funkcji anonimowej.

  • var Nie można używać w polach w zakresie klas.

  • Zmienne zadeklarowane przy użyciu polecenia var nie mogą być używane w wyrażeniu inicjalizacji. Innymi słowy, to wyrażenie jest legalne: int i = (i = 20); ale to wyrażenie generuje błąd czasu kompilacji: var i = (i = 20);

  • Nie można zainicjować wielu niejawnie typizowanych zmiennych w tej samej instrukcji.

  • Jeśli typ o nazwie var znajduje się w zakresie, var słowo kluczowe będzie rozpoznawane jako nazwa tego typu i nie będzie traktowane jako część niejawnie typizowanej deklaracji zmiennej lokalnej.

Niejawne wpisywanie za pomocą słowa kluczowego var można stosować tylko do zmiennych w zakresie metody lokalnej. Niejawne wpisywanie nie jest dostępne dla pól klasy, ponieważ kompilator języka C# napotka logiczny paradoks, ponieważ przetworzy kod: kompilator musi znać typ pola, ale nie może określić typu, dopóki wyrażenie przypisania nie zostanie przeanalizowane, a wyrażenie nie będzie oceniane bez znajomości typu. Spójrzmy na poniższy kod:

private var bookTitles;

bookTitles jest polem klasy, biorąc pod uwagę typ var. Ponieważ pole nie ma wyrażenia do obliczenia, kompilator nie może wywnioskować, jaki typ bookTitles ma być. Ponadto dodanie wyrażenia do pola (tak jak w przypadku zmiennej lokalnej) jest również niewystarczające:

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

Gdy kompilator napotka pola podczas kompilacji kodu, rejestruje typ każdego pola przed przetworzeniem wszelkich wyrażeń skojarzonych z nim. Kompilator napotka ten sam paradoks, który próbuje przeanalizować bookTitles: musi znać typ pola, ale kompilator zwykle określa vartyp " przez analizowanie wyrażenia, co nie jest możliwe bez wcześniejszej znajomości typu.

Może się okazać, że var może być również przydatne w wyrażeniach zapytań, w których dokładny skonstruowany typ zmiennej zapytania jest trudny do określenia. Może się to zdarzyć w przypadku operacji grupowania i porządkowania.

Słowo var kluczowe może być również przydatne, gdy określony typ zmiennej jest żmudny do wpisywania na klawiaturze lub jest oczywisty lub nie dodaje się do czytelności kodu. Przykładem, gdzie var jest to przydatne w ten sposób, jest użycie zagnieżdżonych typów ogólnych, takich jak używane z operacjami grupowymi. W poniższym zapytaniu typ zmiennej kwerendy to IEnumerable<IGrouping<string, Student>>. Jeśli ty i inni użytkownicy, którzy muszą zachować swój kod, nie ma problemu z używaniem niejawnego pisania dla wygody i zwięzłości.

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

Użycie programu pomaga uprościć kod, ale jego użycie var powinno być ograniczone do przypadków, w których jest to wymagane, lub gdy ułatwia odczytywanie kodu. Aby uzyskać więcej informacji na temat prawidłowego używaniavar, zobacz sekcję Niejawnie wpisanych zmiennych lokalnych w artykule Wytyczne dotyczące kodowania w języku C#.

Zobacz też