2010-04-10 21 views
22

¿Cuál es la diferencia entre el tipo anónimo y la tupla?Tipo anónimo y tupla

+2

Aquí hay un artículo que explica lo que quiere: http://msdn.microsoft.com/en-us/vcsharp/ee957397.aspx –

Respuesta

14

Los tipos anónimos tienen nombres de propiedad que llevan más información, para las tuplas no tiene esto. Sin embargo, no puede usar tipos anónimos como valores de retorno y parámetros y puede hacerlo con tuplas.

Un ejemplo de cuando una tupla es agradable es cuando desea devolver valores múltiples. @Petar Minchev mentions this link que da un buen ejemplo.

Puede que desee un método Find() que devuelva un índice y el valor. Otro ejemplo sería la posición en un plano 2D o 3D.

18

Una tupla no es un tipo anónimo, es un tipo con nombre. Puede usarlo como un tipo de devolución o argumento de método. Este código es válido:

Tuple<int, string> GetTuple() 
{ 
    return Tuple.Create(1, "Bob"); 
} 

No se puede hacer esto con un tipo anónimo, que tendría que volver System.Object lugar. Normalmente, termina teniendo que usar Reflection en estos objetos (o dynamic en .NET 4) para obtener los valores de las propiedades individuales.

Además, como se menciona Brian, los nombres de las propiedades en un Tuple son fijos - que están siempre Item1, Item2, Item3 y así sucesivamente, mientras que con un tipo anónimo que pueden elegir los nombres. Si se escribe:

var x = new { ID = 1, Name = "Bob" } 

Entonces el tipo anónimo en realidad tiene ID y Name propiedades. Pero si se escribe:

Tuple.Create(1, "Bob") 

Entonces la tupla resultante sólo tiene propiedades Item1 y Item2.

8

Otro punto a favor de los tipos anónimos sería que fácilmente puede tener más de 8 propiedades. Si bien esto es factible usando tuplas, no es tan bonito.

var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on 

o escribe tus propias clases de tupla.


Una similitud interesante a destacar es que ambos tipos anónimos tuplas y le dan la inmutabilidad y la comparabilidad igualdad (ambos anulaciones Equals y GetHashCode) basado en las propiedades por defecto.

8

Solo una pequeña actualización de esta respuesta ya que C# 7 está fuera de control. Las tuplas ahora tienen superpoderes y algunas veces pueden reemplazar clases y tipos anónimos. Tomemos por ejemplo este método que acepta y devuelve tuplas con propiedades nombradas.

void Main() 
{ 
    var result = Whatever((123, true)); 
    Debug.Assert(result.Something == 123); 
    Debug.Assert(result.Another == "True"); 
} 

(int Something, string Another) Whatever((int Neat, bool Cool) data) 
{ 
    return (data.Neat, data.Cool.ToString()); 
} 

Eso es genial.