Startsidan  ▸  Texter  ▸  Teknikblogg

Anders Hesselbom

Programmerare, skeptiker, sekulärhumanist, antirasist.
Författare till bok om C64 och senbliven lantis.
Röstar pirat.

Varför method groups i C#? Jag är osäker!

2024-05-03

Här är jag lite osäker på vad man försöker göra med C#. En metod är en funktion som tillhör ett objekt. Konceptet känns igen från både C++, Java och C#. En s.k. method group (från nu: metodgrupp) är en C#-term för något som refererar till en eller flera metoder som delar namn. Metodgrupper liknar ungefär delegater, och jag misstänker att detta mest är ett syntaxsocker som inte gör mer för programmeraren än att minska antalet tecken som behöver förvaltas för en programfeature. Detta exempel skriver ordet “Fantastico” på skärmen, och det görs genom att metodgruppen DoSomething tilldelas till delegaten g, för att sedan anropas.

var x = new MinTyp();
var g = x.DoSomething;
g();

public class MinTyp
{
    public void DoSomething(string value = "Fantastico") =>
        Console.WriteLine(value);
}

Till skillnad från en metod, som identifieras av sin signatur (namn och parametrar) så identifieras metodgruppen endast av sitt namn. Klassen MinTyp kan ha flera metoder som heter DoSomething (överlagringar). Exemplet ovan skulle inte kompilera om så vore fallet, eftersom kompilatorn inte skulle veta vilken DoSomething som åsyftas. Detta fungerar inte:

var x = new MinTyp();
var g = x.DoSomething;
g();

public class MinTyp
{
    public void DoSomething(string value = "Fantastico") =>
        Console.WriteLine(value);

    public void DoSomething() =>
        Console.WriteLine("Hello!");
}

Men om jag specificerar vilken datatyp variabeln g har, så vet kompilatorn vad som åsyftas. Om jag t.ex. säger att g är en Action<string> och tillgodoser det när jag anropar g, så accepteras koden. Detta ger svaret “God dag!”:

var x = new MinTyp();
Action<string> g = x.DoSomething;
g("God dag!");

public class MinTyp
{
    public void DoSomething(string value = "Fantastico") =>
        Console.WriteLine(value);

    public void DoSomething() =>
        Console.WriteLine("Hello!");
}

Det går även bra att fylla delegaten med fler metodgrupper som passar i den datatyp som delegaten fastslagits till. Här kommer ett anrop på g leda till ett anrop på DoSomething (överlagringen utan argument) och WriteAJoke:

var x = new MinTyp();
Action g = x.DoSomething;
g += WriteAJoke;
g();

void WriteAJoke() =>
    Console.WriteLine("- What’s brown and sticky? - A stick.");

public class MinTyp
{
    public void DoSomething() =>
        Console.WriteLine("Hello!");
}

public class EnAnnanTyp
{
    public static void DoSomething() =>
        Console.WriteLine("En statisk funktion");
}

Och det är egentligen där användbarheten når vägs ände. Det är snyggt, men det tillför just inget. När metodgrupper används i [lista].ForEach så sparar man förvisso en del tecken, men det kommer fortfarande att kompileras till en instansering av delegaten och en funktionspekare till den funktion som kompilatorn har bundit anropet till. Om jag har missat något, så skulle jag uppskatta en kommentar!

Categories: C#

Leave a Reply

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



En kopp kaffe!

Bjud mig på en kopp kaffe (20:-) som tack för bra innehåll!

Bjud på en kopp kaffe!

Om...

Kontaktuppgifter, med mera, finns här.

Följ mig

Twitter Instagram
GitHub RSS

Public Service

Folkbildning om public service.

Hem   |   linktr.ee/hesselbom   |   winsoft.se   |   80tal.se   |   Filmtips