int i = 42; // явное задание типа var j = 42; // неявное задание типаВ примере выше переменная j будет типа int точно так же, как и i. При желании можно легко в этом убедиться, заглянув в MSIL:
IL_0000: nop IL_0001: ldc.i4.s 42 IL_0003: stloc.0 IL_0004: ldc.i4.s 42IntelliSense в Visual Studio также без проблем разбирается с неявно типизированными переменными:
Оператор var
можно использовать как в циклах for, так и в объявлениях using. Но
struct SomeStruct { public int a; public int b; public int c; } static void Main(string[] args) { int[] numbers = new[] { 0, 1, 2, 3, 4, 5 }; // здесь использование var необязательно - мы можем использовать // вместо него явно заданный IEnumerablevar numberQuery = from number in numbers where number > 1 && number <= 4 select number; // так как numberQuery - объект неанонимного типа, в foreach можно // использовать явно типизированный итератор foreach (int i in numberQuery) { Console.WriteLine(i.ToString()); } SomeStruct[] structures = new[] { new SomeStruct { a=1,b=2,c=3}, new SomeStruct { a=3,b=4,c=5}, new SomeStruct { a=7,b=8,c=9}, }; // результат этого запроса - коллекция экземпляров анонимного типа. // в данном случае использование var обязательно. var structQuery = from structure in structures where structure.a <= 3 select new { NewA = structure.a, NewB = structure.b }; // опять же, из-за анонимности типа в LINQ-запросе, мы не можем явно // указать тип итератора, поэтому обязательно использовать var. foreach (var j in structQuery) { Console.WriteLine(String.Format("NewA={0},NewB={1}", j.NewA, j.NewB)); } }
Итак, неявно типизированные переменные и идентификатор var — отличное средство улучшения читабельности и лёгкости написания кода (сравните var someQuery и IEnumerable<somelongandnastytype> someQuery !) и незаменимое решение при использовании анонимных типов.
Implicitly Typed Local Variables (C# Programming Guide)
Anonymous Types (C# Programming Guide)