2010-06-25 31 views

Respuesta

17

Tendría que pedirle a los diseñadores de BCL que estén seguros, pero sospecho que, dado que hay 1-tuplas en el mundo real, los autores de .NET framework querían proporcionar una simetría equivalente en su implementación.

Tuples son la implementación .NET de lo que consideraría el mathematical concept of a tuple.

Ahora bien, puesto que está pidiendo la programación utiliza para Tuple<T>, lo haría también respuesta que hay lenguajes .NET (como F #) que podrían utilizar Tuple<> para la representación de cosas como valores de retorno de las funciones. Como una función F # ciertamente podría devolver una 1-tupla como resultado, agrega simetría y consistencia al comportamiento y la sensación del lenguaje.

Su ejemplo con 8+ tuplas también es probablemente legítimo, ya que la propiedad Rest podría ser un 1-tuple para representar el "desbordamiento".

+3

No creo que en realidad es posible para construir una 1-tupla en F # idiomática, porque el operador de coma es lo que crea una tupla en ese idioma. 'let foo = 3,5' es la definición de una 2-tupla que contiene 3 y 5, pero la única manera de crear una 1-tupla en F #, creo, es de la misma manera que lo harías en C#: 'nuevo System.Tuple (5)' –

+2

O 'Tuple.Create' por supuesto. Aún así, hasta donde yo sé, las 1-tuplas son el único tipo que F # no proporciona ningún azúcar sintáctico. –

+2

@LBushkin hola, ¿alguna vez has visto el código F #/C# real que usa 1-tupla? Tengo curiosidad por los casos de uso del mundo real. – ZhongYu

4

Todos los tipos de tupla implementan ITuple, así que supongo que cuando desee tener un tipo de devolución que sea ITuple, necesita la opción de tener un valor único, como sugiere.

+3

El único problema es que ITuple es interno de mscorlib, así que no puedo usarlo de todos modos :) –

+2

Eso explica por qué MSDN no tiene ninguna documentación en él, aparte de la declaración de los diferentes tipos de Tuple ... ;) – Oded

7

Tuples implementan automáticamente IStructuralComparable y IStructuralEquatable, entre otras cosas. Esto permite que las tuplas se comparen y clasifiquen de la caja. Del artículo de Bill McCarthy en diciembre de 2009 edición de Visual Studio Revista, "Tipos y tuplas en .NET 4":

Aunque tuplas pueden parecer simple y anodino, proporcionan una gran escritura y comparación importante y funcionalidad de la igualdad . Las tuplas son útiles a través del método, la clase o incluso los límites de la máquina.

Al poner su tipo de datos en una tupla, incluso de un solo elemento, se garantiza la inmutabilidad, la igualdad y la comparabilidad. Para las tuplas consistentes en un solo elemento, el principal beneficio de usar una tupla será la inmutabilidad: una vez que se crea la tupla, sus datos nunca pueden cambiar durante la vida de la tupla.

+6

No veo cómo se logra la inmutabilidad, la equabilidad y la comparabilidad. Si coloca datos mutables en una tupla, aún puede mutar esos datos. Similar para equabilidad y comparabilidad ... ¿Cómo agregar los datos en una tupla agregaría algún tipo (significativo) de comparabilidad? –

+0

@johan Sacas un buen punto, especialmente porque se aplica a objetos complejos. Eso podría ser una buena pregunta por separado. –

+0

Sí, 'Tuple ' se puede usar como envoltorios, a veces es útil. – nawfal

3

Aunque este es un hilo antiguo, estaba preparando una respuesta para Why use a 1-tuple, Tuple<T1> in C#?, que ahora está marcado como un duplicado.

Uno posible uso de un 1-Tuple, es devolver una instancia nula si no hay ningún valor, pero ese nulo del valor del elemento en sí mismo, no significa que no hay ningún resultado.

Por ejemplo (no es un muy buen ejemplo de la vida real, pero es de esperar que transmite el punto)

static List<string> List = new List<string> {"a", "b", null, "c"}; 

    static Tuple<string> GetItemAtIndex(int index) 
    { 
     if (index < 0 || index >= List.Count) 
      return null; 
     return Tuple.Create(List[index]); 
    } 

El código de llamada sabría que cuando la tupla en sí es nula, no existe en la lista, pero si el Item1 es nulo, en realidad había un elemento nulo en la lista. Por supuesto, en este ejemplo, existen muchas soluciones alternativas mejores, pero también podría aplicarse a un resultado de una base de datos: no se encontró ningún resultado o un resultado nulo.

Ampliando esa misma lógica, se puede usar una Tuple para crear fácilmente métodos genéricos que pueden devolver nulo para cualquier tipo. Por ejemplo

static Tuple<T> GetSomething<T, RecType>(RecType rec, Func<RecType, T> fn) 
    { 
     if (rec == null) return null; 
     //extra example, access would be checked by something like CheckCurrentUserAccess(rec) 
     bool AccesDenied = true; 
     if (AccesDenied) return null; //sometimes you don't want to throw an exception ;) 

     return Tuple.Create(fn(rec)); 
    } 

Se podía volver Nullable<T>, pero que sólo trabajaría para estructuras, donde esto funciona con cualquier tipo, aunque int, string, int?, MyClass, etc

+0

Eso es básicamente usar el 1-Tuple como una Monad de Maybe/Option. Caso de uso interesante, pero posiblemente inesperado, pero está en el Marco, mientras que una Mónada Maybe/Option no lo es. –

Cuestiones relacionadas