C# Academy · Lektion

delegate, Action/Func, closures

Skicka beteende med delegates: deklarera egna delegates, använd de inbyggda Action/Func och se hur lambdas fångar variabler (closures).

Lektion 1 av 38 steg

delegate, Action/Func, closures är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 1 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 3 lektioner.

Översikt över delegater

Mål: Behandla metoder som data.

  • Definiera en delegattyp
  • Använd Action/Func
  • Skapa lambda-uttryck
  • Förstå closures (infångade variabler)

Grunderna i egna delegater

En delegat är en typsäker funktionspekare. Tilldela kompatibla metoder och anropa delegaten som en funktion.

using System;

// Custom delegate type: a method taking two ints and returning int
public delegate int Op(int x, int y);

public class Program
{
  static int Add(int a, int b) { return a + b; }
  static int Mul(int a, int b) { return a * b; }

  public static void Main(string[] args)
  {
    Op f = Add;                // method group conversion
    Console.WriteLine(f(2, 3)); // 5
    f = Mul;
    Console.WriteLine(f(2, 3)); // 6
  }
}

Action och Func

Action representerar metoder som returnerar void; Func returnerar ett värde. Använd metodgrupper eller lambda-uttryck.

using System;

public class Program
{
  static void Log(string s) { Console.WriteLine("LOG: " + s); }

  public static void Main(string[] args)
  {
    Action<string> a = Log;                        // no return
    a("hello");

    Func<int, int, int> sum = delegate(int x, int y) { return x + y; }; // lambda/anon method
    Console.WriteLine(sum(3, 4)); // 7

    // Method group to Func
    Func<string, int> len = GetLen;
    Console.WriteLine(len("abc")); // 3
  }

  static int GetLen(string s) { return s == null ? 0 : s.Length; }
}

Demo av closure

En closure fångar variabler från det yttre omfånget. Variabeln lever längre än metoden som skapade delegaten.

using System;

public class Program
{
  public static void Main(string[] args)
  {
    int counter = 0; // captured variable (lives as long as delegate)
    Action inc = delegate() { counter = counter + 1; Console.WriteLine(counter); };

    inc(); // 1
    inc(); // 2
    Console.WriteLine("Final=" + counter); // 2
  }
}

Metod av högre ordning

Skicka en Func eller Action för att anpassa beteendet. Detta ligger till grund för många API:er (och LINQ).

using System;

public class Program
{
  // Apply a transform to each number and sum the results
  static int SumBy(int[] xs, Func<int, int> transform)
  {
    int total = 0;
    for (int i = 0; i < xs.Length; i++)
    {
      total += transform(xs[i]);
    }
    return total;
  }

  public static void Main(string[] args)
  {
    int[] data = new int[] { 1, 2, 3 };
    int sumSquares = SumBy(data, delegate(int x) { return x * x; });
    Console.WriteLine(sumSquares); // 14
  }
}

Tips för delegater

Tips:

  • Föredra Action/Func framför extra egna delegattyper.
  • Håll lambda-uttryck korta och tydliga.
  • Var uppmärksam på infångade variabler; deras värde kan ändras senare.
  • Använd metodgrupper när en namngiven metod redan matchar signaturen.

Betydelsen av Func jämfört med Action

Snabbkontroll: Vilken inbyggd delegattyp representerar en metod som returnerar ett värde?

Sammanfattning

Sammanfattning: Deklarera delegater, använd Action/Func och skriv små lambda-uttryck. Closures låter lambda-uttryck fånga lokala variabler – använd dem med omsorg.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”delegate, Action/Func, closures” gratis?

Ja – hela texten till ”delegate, Action/Func, closures” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”delegate, Action/Func, closures”?

Skicka beteende med delegates: deklarera egna delegates, använd de inbyggda Action/Func och se hur lambdas fångar variabler (closures). Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 3.

Hur lång tid tar lektionen ”delegate, Action/Func, closures”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. delegate, Action/Func, closures
  2. Händelser: publicera/prenumerera, nyckelordet event
  3. Händelsemönster och fallgropar (minnesläckor)
← Tillbaka till C# Academy