C# Academy · leksjon

Lokale funksjoner kontra lambdaer

Velg mellom lokale funksjoner og lambdaer.

Leksjon 4 av 413 trinn

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.
Gratis å komme i gang

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

  1. Deklarere lokale funksjoner
  2. Closures og innfangede variabler
  3. Statiske lokale funksjoner
  4. Lokale funksjoner kontra lambdaer
← Tilbake til C# Academy