Tag: C#7

  • Lite nyheter i C# 7: Tuples

    Lite nyheter i C# 7: Tuples

    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