Förenklad hantering av funktioner som producerar multipla värden i C#

with No Comments

Ganska ofta infinner sig behovet av att bygga en funktion som producerar mer än ett värde. Detta löser man exempelvis med hjälp av utparametrar eller tuples (sv: tupel) och båda metoderna har fått bättre stöd i C# version 7.0.

Utparametrar har tidigare endast kunnat användas mot fördeklarerade variabler, vilket innebär att variablerna är hänvisade till ett större scope än vad som kanske behövs, vilket kan illustreras med följande exempel. Koden nedan skapar en variabel – count – i en kontext som är större än nödvändigt. Variabeln får sitt värde i konstruktoranropet, och används bara tillsammans med returen från konstruktoranropet, men den har ändå behövt deklareras utanför det enda blocket där den faktiskt behövs.

I C# 7 är det tillåtet att skapa variabler som används till utparametrar inline, alltså direkt vid användning. Det ger möjligheten att begränsa variabelns räckvidd, så att den inte är större än vad som behövs.

Om man vill arbeta med tuples, så har C# 7 äntligen språkligt stöd för detta. En funktion som producerar två ints, kan kort och gott deklareras så här (givet att Nuget-paketet System.ValueTuple är installerat):

Syntaxen tillåter även att medlemmarna i strukturen namnges, vilket naturligtvis bidrar med tydlighet.

Tuples skiljer sig från anonyma objekt genom att medlemmarnas namn inte har någon betydelse. Låt oss först titta anonyma objekt. Dessa två instanser delar typ, eftersom de har tilldelats samma utbud av egenskaper (properties):

Av det skälet är inte a3 (nedan) av samma typ a1 eller a2 (ovan) – den saknar Name, men har istället en egenskap som heter LastName.

Men en tuple definieras inte av vad medlemmen heter, endast av medlemmarnas typ och ordning, så medlemsnamnet påverkar endast hur man når medlemmen i kod, inte vilken typ objektet har. I detta exempel är både t1, t2 och t3 av samma typ, trots att de har olika namn på sitt andra attribut:

Och dessa objekts medlemmar kan refereras till med med vilket namn som helst. När objekten t1, t2 och t3 skapades (ovan) hette den andra egenskapen Name eller LastName, men här refererar jag till den andra medlemmen som Name för alla tre instanser:

Så det språkliga stödet för tuples introducerar möjligheten att namnge medlemmarna fritt, men precis som tidigare är det medlemmarnas typ och ordning som definierar objektets typ. Möjligheten att deklarera variabler som används till utparametrar inline både ökar möjligheten att begränsa variablernas scope och kortar ner koden. Båda dessa nyheter finns tillgängliga i C# 7.0 som levereras med Visual Studio 2017, som finns tillgängligt från 7/3.

Follow Anders Hesselbom:

Latest posts from

Leave a Reply