0Pricing
C# Academy · Lezione

Funzioni locali e lambda a confronto

Scelga tra funzioni locali e lambda.

Funzioni locali e lambda a confronto è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Funzioni locali e lambda

Sia le funzioni locali sia le lambda consentono di definire piccole funzioni all'interno di un metodo. Si sovrappongono in molti aspetti, ma differiscono per sintassi, funzionalità e prestazioni. Scegliere quella corretta mantiene il codice chiaro ed efficiente.

Due modi per scrivere un helper

Qui lo stesso helper per elevare al quadrato è scritto sia come funzione locale sia come lambda assegnata a un delegato. Entrambe producono lo stesso risultato.

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));
    }
}

Le funzioni locali consentono facilmente la ricorsione

Una funzione locale può chiamare sé stessa per nome. Una lambda non può fare riferimento alla propria variabile durante l'inizializzazione, quindi la ricorsione con le lambda è macchinosa.

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));
    }
}

Le funzioni locali possono essere generiche

Le funzioni locali supportano propri parametri di tipo. Le lambda non possono essere generiche, quindi una funzione locale è la scelta adatta per helper tipizzati e riutilizzabili.

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" }));
    }
}

Prestazioni: evitare l'allocazione di delegati

Una lambda assegnata a un delegato può allocare un oggetto delegato e, se cattura variabili, anche una closure. Una funzione locale chiamata direttamente evita entrambe le allocazioni, un aspetto importante nei cicli più eseguiti.

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);
    }
}

Parametri out e ref

Le funzioni locali possono dichiarare parametri out e ref; le lambda che usano i delegati comuni Func/Action non possono farlo. Questo rende naturali gli helper in stile try-parse come funzioni locali.

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);
    }
}

Le lambda brillano come argomenti inline

Quando deve passare direttamente un comportamento a un metodo come LINQ Where o Select, una lambda è l'opzione più concisa e leggibile.

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));
    }
}

Il capture funziona per entrambe

Entrambe le forme possono catturare variabili del contesto esterno. La differenza riguarda soprattutto la sintassi e il costo di allocazione, non la possibilità di effettuare il capture.

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));
    }
}

Assegnazione definita e ordine

Una funzione locale può essere chiamata prima della sua dichiarazione nel metodo; una variabile lambda deve essere assegnata prima dell'utilizzo. Questo rende più flessibile la posizione delle funzioni locali.

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Triple(4)); // allowed before declaration

        int Triple(int n) => n * 3;
    }
}

Come scegliere tra le due

Utilizzi una funzione locale per helper con nome, riutilizzabili, ricorsivi, generici o in percorsi a esecuzione frequente. Utilizzi una lambda per un comportamento breve e inline passato direttamente a un altro metodo. Sono entrambi strumenti: scelga in base all'intento.

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));
    }
}

Provi personalmente

Utilizzi una funzione locale ricorsiva per la logica principale e una lambda per la proiezione LINQ inline, lasciando che ogni costrutto svolga al meglio il proprio compito.

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);
    }
}

Verifica rapida

Confronti i due costrutti.

Riepilogo

Le funzioni locali e le lambda hanno caratteristiche in comune, ma differiscono per alcuni aspetti fondamentali.

  • Le funzioni locali possono essere ricorsive, generiche e utilizzare out/ref.
  • Quando vengono chiamate direttamente, evitano le allocazioni di delegate e closure.
  • Le lambda sono particolarmente concise come argomenti inline di metodi come LINQ.
  • Scelga in base all'intento: helper con nome e riutilizzabile oppure comportamento breve e inline.

Domande Frequenti

La lezione «Funzioni locali e lambda a confronto» è gratuita?

Sì — il testo completo di «Funzioni locali e lambda a confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Funzioni locali e lambda a confronto»?

Scelga tra funzioni locali e lambda. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Funzioni locali e lambda a confronto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Dichiarazione delle funzioni locali
  2. Closure e variabili catturate
  3. Funzioni locali statiche
  4. Funzioni locali e lambda a confronto
← Torna a C# Academy