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).
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
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.
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
- delegate, Action/Func, closures
- Händelser: publicera/prenumerera, nyckelordet event
- Händelsemönster och fallgropar (minnesläckor)