Lokale funksjoner kontra lambdaer
Velg mellom lokale funksjoner og lambdaer.
Lokale funksjoner kontra lambdaer er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Lokale funksjoner kontra lambda-uttrykk
Både lokale funksjoner og lambda-uttrykk gjør det mulig å definere små funksjoner inne i en metode. De overlapper i stor grad, men er forskjellige når det gjelder syntaks, funksjonalitet og ytelse. Ved å velge riktig løsning blir koden tydelig og effektiv.
To måter å skrive en hjelpefunksjon på
Her er den samme hjelpefunksjonen for kvadrering skrevet både som en lokal funksjon og som et lambda-uttrykk tilordnet en delegat. Begge gir samme resultat.
using System;
public class Program
{
public static void Main()
{
int SquareFn(int n) => n * n; // local function
Func<int, int> squareLambda = n => n * n; // lambda
Console.WriteLine(SquareFn(4));
Console.WriteLine(squareLambda(4));
}
}Lokale funksjoner gjør rekursjon enkelt
En lokal funksjon kan kalle seg selv ved navn. Et lambda-uttrykk kan ikke referere til sin egen variabel under initialiseringen, så rekursjon blir mer omstendelig med lambda-uttrykk.
using System;
public class Program
{
public static void Main()
{
// Clean recursion with a local function
int Factorial(int n) => n <= 1 ? 1 : n * Factorial(n - 1);
Console.WriteLine(Factorial(5));
}
}Lokale funksjoner kan være generiske
Lokale funksjoner støtter egne typeparametere. Lambda-uttrykk kan ikke være generiske, så en lokal funksjon er riktig valg for gjenbrukbare, typede hjelpefunksjoner.
using System;
public class Program
{
public static void Main()
{
T First<T>(T[] items) => items[0]; // generic local function
Console.WriteLine(First(new[] { 9, 8, 7 }));
Console.WriteLine(First(new[] { "a", "b" }));
}
}Ytelse: unngå allokering av delegater
Et lambda-uttrykk som tilordnes en delegat, kan allokere et delegatobjekt og, hvis det fanger inn noe, en closure. En lokal funksjon som kalles direkte, unngår begge deler, noe som er viktig i ytelseskritiske løkker.
using System;
public class Program
{
public static void Main()
{
// Direct call, no delegate or closure allocation
static int Add(int a, int b) => a + b;
int total = 0;
for (int i = 0; i < 5; i++) total = Add(total, i);
Console.WriteLine(total);
}
}out- og ref-parametere
Lokale funksjoner kan deklarere out- og ref-parametere; lambda-uttrykk via de vanlige Func/Action-delegatene kan ikke det. Derfor egner try-parse-hjelpefunksjoner seg godt som lokale funksjoner.
using System;
public class Program
{
public static void Main()
{
bool TryGetFirstDigit(string s, out int digit)
{
digit = 0;
foreach (var c in s)
if (char.IsDigit(c)) { digit = c - '0'; return true; }
return false;
}
if (TryGetFirstDigit("abc4", out int d))
Console.WriteLine(d);
}
}Lambdaer fungerer best som inline-argumenter
Når De trenger å sende atferd direkte inn i en metode som LINQ-Where eller Select, er en lambda det mest konsise og lesbare alternativet.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var nums = new List<int> { 1, 2, 3, 4, 5, 6 };
var evens = nums.Where(n => n % 2 == 0).Select(n => n * 10);
Console.WriteLine(string.Join(", ", evens));
}
}Begge støtter variabelfangst
Begge formene kan fange inn variabler fra det omsluttende området. Forskjellen ligger hovedsakelig i syntaksen og allokeringskostnaden, ikke i om variabelfangst er mulig.
using System;
public class Program
{
public static void Main()
{
int bonus = 10;
int WithBonusFn(int n) => n + bonus; // captures
Func<int, int> withBonusLambda = n => n + bonus; // captures
Console.WriteLine(WithBonusFn(5));
Console.WriteLine(withBonusLambda(5));
}
}Definitiv tilordning og rekkefølge
En lokal funksjon kan kalles før deklarasjonen i metoden, mens en lambda-variabel må være tilordnet før den brukes. Dette gir lokale funksjoner en mer fleksibel plassering.
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(Triple(4)); // allowed before declaration
int Triple(int n) => n * 3;
}
}Velge mellom dem
Bruk en lokal funksjon for navngitte, gjenbrukbare, rekursive eller generiske hjelpefunksjoner, eller hjelpefunksjoner i ytelseskritiske kodebaner. Bruk en lambda for kort, inline-atferd som sendes direkte til en annen metode. Begge er verktøy; velg ut fra hensikten.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
static bool IsPrime(int n)
{
if (n < 2) return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
var primes = Enumerable.Range(2, 20).Where(IsPrime);
Console.WriteLine(string.Join(", ", primes));
}
}Prøv selv
Bruk en rekursiv lokal funksjon for kjernelogikken og en lambda for den innebygde LINQ-projeksjonen, slik at hver konstruksjon får gjøre det den egner seg best til.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
// Local function: recursive, named, reusable
static int DigitCount(int n) => Math.Abs(n) < 10 ? 1 : 1 + DigitCount(n / 10);
var nums = new List<int> { 5, 42, 1000, 7, 88 };
// Lambda: concise inline projection
var report = nums.Select(n => n + " has " + DigitCount(n) + " digits");
foreach (var line in report) Console.WriteLine(line);
}
}Hurtigsjekk
Sammenlign de to konstruksjonene.
Oppsummering
Lokale funksjoner og lambdaer overlapper, men skiller seg på viktige områder.
- Lokale funksjoner kan være rekursive og generiske, og kan bruke
out/ref. - Når de kalles direkte, unngår de allokering av delegater og lukkede miljøer.
- Lambdaer er mest konsise som inline-argumenter til metoder som LINQ.
- Velg ut fra hensikten: en navngitt, gjenbrukbar hjelpefunksjon eller kort inline-atferd.
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Lokale funksjoner kontra lambdaer» gratis?
Ja – hele teksten i «Lokale funksjoner kontra lambdaer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Lokale funksjoner kontra lambdaer»?
Velg mellom lokale funksjoner og lambdaer. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Lokale funksjoner kontra lambdaer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Deklarere lokale funksjoner
- Closures og innfangede variabler
- Statiske lokale funksjoner
- Lokale funksjoner kontra lambdaer