Что делает var
действительно в следующем случае?
var productInfos =
from p in products
select new { p.ProductName, p.Category, Price = p.UnitPrice };
var
- это заполнитель для созданного компилятором ("анонимного") типа, который имеет три свойства, ProductName
, Category
и Price
.
Это НЕ вариант (например, как в Visual Basic). Это конкретный тип и может быть использован как таковой в других местах кода.
Две строки:
var productInfos = from p in products
select new { p.ProductName, p.Category, Price = p.UnitPrice };
и
IEnumerable<CompilerGeneratedType> productInfos = from p in products
select new { p.ProductName, p.Category, Price = p.UnitPrice };
эквивалентны. CompilerGeneratedType
- это тип, который будет создан компилятором и имеет три общедоступных свойства ProductName, Price и Category
. var
полезен по двум причинам:
CompilerGeneratedType
будет сгенерирован компилятором, поэтому вы не сможете использовать имя типа в объявлении. переменные с var - это неявно типизированная локальная переменная, которая строго типизирована, как если бы вы сами объявили тип, но компилятор определяет тип. он получает тип результата.
и здесь неплохое прочтение Дебаты по C #: когда следует использовать var?
и еще одно Учебное пособие по C # 3.0
Оно избавляет вас от боль от необходимости объявлять точный тип результата запроса вручную. Но я должен посочувствовать, это не динамическая типизация: переменная productInfos
будет иметь статический тип, но создается компилятором вместо вас.
В данном конкретном случае тип productInfos - это созданный компилятором анонимный тип с 3 свойствами: ProductName, Category и Price.
var = дружественный к программисту = меньше типизации = делает вас ленивым (другой взгляд на это) = вносит неясность в код, если новый для 3.5 FW