Om jag vill skapa en funktion som skickar tillbaka två värden, kan det lösas med en tuple. I .NET Framework är tuples implementerat som en generisk klass. Denna funktion skickar tillbaka en int och en string:

public static Tuple<int, string> DoSomething()
{
    return Tuple.Create(10, "Hello");
}

Ett anrop som tar emot svaren skulle kunna se ut så här. I detta fall är response av typen Tuple<int, string>, vilket innebär att Item1 är en int och Item2 en string.

var response = DoSomething();
Console.WriteLine(response.Item1); //10
Console.WriteLine(response.Item2); //"Hello"

Eftersom C# 7 har inbyggt stöd för tuples, behöver jag inte hänvisa till klassen Tuple. Det går helt enkelt att deklarera fler returer på en funktion.

Samma funktion i C# 7 kan se ut så här (givet att NuGet-paketet System.ValueTuple är på plats):

public static (int, string) DoSomething()
{
    return (10, "Hello");
}

Koden som utför anropet kan se lika dan ut. Variabeln response är nu en (int, string) istället för en Tuple<int, string>.

Funktionens returvärden kan dessutom ha specificerade namn, vilket gör koden mer självdokumenterande.

public static (int i, string s) DoSomething()
{
    return (10, "Hello");
}

Anropet:

var response = DoSomething();
Console.WriteLine(response.i); //10
Console.WriteLine(response.s); //"Hello"

Tuples kan skapas inline (x nedan), inline med namngivna medlemmar (y nedan) eller inline med type inference (z nedan).

(int, int, int) x = (10, 20, 30);
Console.WriteLine(x.Item1); //10

(int kalle, int pelle, int sven) y = (10, 20, 30);
Console.WriteLine(y.kalle); //10

var z = (10, 20, 30);
Console.WriteLine(z.Item1); //10

Leave a Reply

Your email address will not be published. Required fields are marked *