Obwohl dies ein alter Thread ist, bereitete ich eine Antwort für Why use a 1-tuple, Tuple<T1> in C#? vor, die jetzt als ein Duplikat markiert ist.
Ein möglich Verwendung eines 1-Tuple, ist eine Instanz null zurück, wenn kein Wert ist, sondern dass null des Warenwertes selbst, bedeutet nicht, kein Ergebnis.
Zum Beispiel (kein sehr gutes richtigen Beispiel, aber hoffentlich vermittelt er den Punkt)
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]);
}
Der Aufrufcode würde wissen, dass, wenn das Tupel selbst null ist, ist es nicht in der Liste noch nicht gab, Wenn jedoch Item1 gleich null ist, war in der Liste tatsächlich ein Nullelement vorhanden. Natürlich gibt es in diesem Beispiel viele bessere Problemumgehungen, aber es könnte auch für ein Ergebnis aus einer Datenbank gelten: kein Ergebnis gefunden oder ein Ergebnis, das null ist.
Die gleiche Logik erweiternd, kann ein Tuple verwendet werden, um einfach generische Methoden zu erstellen, die null für jeden Typ zurückgeben können. Zum Beispiel
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));
}
Sie könnten Nullable<T>
zurückkehren, aber das wäre für structs nur funktionieren, wo dies mit jeder Art funktioniert, wenn auch int
, string
, int?
, MyClass
, etc
Ich glaube nicht, es ist tatsächlich möglich, ein 1-Tupel in idiomatischem F # zu konstruieren, weil der Komma-Operator ein Tupel in dieser Sprache erzeugt. 'let foo = 3,5 'ist die Definition eines 2-Tupel mit 3 und 5, aber die einzige Möglichkeit, ein 1-Tupel in F # zu erstellen, denke ich, ist die gleiche, wie in C#: 'neues System.Tuple (5)' –
Oder 'Tuple.Create' natürlich. Soweit ich weiß, sind 1-Tupel die einzige Sorte, für die F # keinen syntaktischen Zucker liefert. –
@LBushkin Hallo, haben Sie jemals tatsächlichen F #/C# -Code gesehen, der 1-Tupel verwendet? Ich bin neugierig auf die Anwendungsfälle der realen Welt. – ZhongYu