2010-05-02 9 views
8

¿Qué significa realmente var en el siguiente caso?Uso de var en linq

var productInfos = 
from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice }; 
+0

var es la variable que no tiene ningún tipo de datos. puedes almacenar cualquier cosa en var variable. – Xulfee

Respuesta

7

var es un marcador de posición para un compilador-creado ("anonymous") type que tiene tres propiedades, ProductName, Category y Price.

NO es una variante (por ejemplo, como en Visual Basic). Es un tipo concreto y se puede usar como tal en otros lugares del código.

3

variables con var son variables locales tipadas implícitamente que se escriben fuertemente como si hubiera declarado el tipo usted mismo, pero el compilador determina el tipo. obtiene el tipo de resultado.

y aquí un buen leer C# Debate: When Should You Use var?

y aquí otra C# 3.0 Tutorial

0

Se le facilita el dolor de tener que declarar el tipo exacto de su resultado de la consulta manualmente. Pero tengo que empatizar, esto no es tipado dinámico: la variable productInfos tendrá un tipo estático, pero es creado por el compilador en lugar de usted.

4

En este caso particular, el tipo de productoInfos es un compilador generado Anonymous Type con 3 propiedades, NombreProducto, Categoría y Precio.

9

Las dos líneas:

var productInfos = from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice }; 

y

IEnumerable<CompilerGeneratedType> productInfos = from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice }; 

son equivalentes. CompilerGeneratedType es un tipo que será creado por el compilador y tiene las tres propiedades públicas ProductName, Price, and Category. var es útil por dos razones:

  1. CompilerGeneratedType serán generados por el compilador por lo que es imposible que declara una variable que tiene ese tipo.
  2. No tiene que pensar demasiado sobre el tipo de colección del resultado. Linq puede hacer lo suyo y no tiene que preocuparse por eso.
+2

Esa es una buena respuesta, pero no es 100% correcta. Es bastante posible referirse al CompilerGeneratedType. No directamente por su nombre, pero ciertamente indirectamente. Por ejemplo: var test = new {P1 = "Hello", P2 = "Bye"}; Escriba t = test.GetType(); produce un tipo concreto con un nombre concreto, en mi caso de ejemplo concreto UnderlyingSystemType: {<> f__AnonymousType0'2 [System.String, System.String]}. –

2

var = programador de usar = = teclear menos hace perezoso (otra manera de ver las cosas) = ​​trae la oscuridad para codificar si el nuevo FW a 3,5