Paikalliset funktiot ja lambdat
Valitkaa paikallisten funktioiden ja lambdojen välillä.
Paikalliset funktiot ja lambdat on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.
Paikalliset funktiot ja lambda-lausekkeet
Sekä paikallisilla funktioilla että lambda-lausekkeilla voi määrittää pieniä funktioita metodin sisällä. Ne ovat monelta osin samanlaisia, mutta eroavat syntaksiltaan, ominaisuuksiltaan ja suorituskyvyltään. Oikean vaihtoehdon valinta pitää koodin selkeänä ja tehokkaana.
Kaksi tapaa kirjoittaa apufunktio
Tässä sama neliöintiapufunktio kirjoitetaan sekä paikallisena funktiona että delegaattiin sijoitettuna lambda-lausekkeena. Molemmat tuottavat saman tuloksen.
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));
}
}Paikalliset funktiot mahdollistavat rekursion helposti
Paikallinen funktio voi kutsua itseään nimellään. Lambda-lauseke ei voi viitata omaan muuttujaansa alustuksen aikana, joten rekursion toteuttaminen lambda-lausekkeilla on hankalaa.
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));
}
}Paikalliset funktiot voivat olla geneerisiä
Paikalliset funktiot tukevat omia tyyppiparametrejaan. Lambda-lausekkeet eivät voi olla geneerisiä, joten uudelleenkäytettäviin tyypitettyihin apufunktioihin kannattaa valita paikallinen funktio.
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" }));
}
}Suorituskyky: delegaattien varausten välttäminen
Delegaattiin sijoitettu lambda-lauseke voi varata delegaattiolion ja kaapatessaan myös sulkeuman. Suoraan kutsuttu paikallinen funktio välttää molemmat, millä on merkitystä suorituskykykriittisissä silmukoissa.
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- ja ref-parametrit
Paikalliset funktiot voivat määrittää out- ja ref-parametreja, mutta yleisten Func/Action-delegaattien kautta käytettävät lambda-lausekkeet eivät voi. Siksi try-parse-apufunktiot on luontevaa toteuttaa paikallisina funktioina.
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);
}
}Lambda-lausekkeet ovat parhaimmillaan inline-argumentteina
Kun käyttäytyminen on välitettävä suoraan LINQ:n kaltaiselle metodille, kuten Where- tai Select-metodille, lambda-lauseke on tiivein ja selkein vaihtoehto.
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));
}
}Molemmat tukevat kaappausta
Molemmat muodot voivat kaapata ympäröivän kontekstin muuttujia. Ero liittyy enimmäkseen syntaksiin ja allokointikustannuksiin, ei siihen, onko kaappaus mahdollista.
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));
}
}Varma sijoitus ja järjestys
Paikallista funktiota voi kutsua metodissa ennen sen määrittelyä, mutta lambda-muuttujalle on annettava arvo ennen sen käyttöä. Tämä antaa paikallisille funktioille joustavammat sijoitusmahdollisuudet.
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(Triple(4)); // allowed before declaration
int Triple(int n) => n * 3;
}
}Kumman valitseminen
Käyttäkää paikallista funktiota nimettyihin, uudelleenkäytettäviin, rekursiivisiin tai geneerisiin apufunktioihin sekä suorituskyvyn kannalta kriittisiin kohtiin. Käyttäkää lambda-lauseketta lyhyeen, suoraan toiselle metodille välitettävään toimintaan. Molemmat ovat työkaluja, joten valitkaa käyttötarkoituksen perusteella.
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));
}
}Kokeile itse
Käyttäkää rekursiivista paikallista funktiota ydinlogiikkaan ja lambda-lauseketta inline-LINQ-projektioon, jotta kumpikin rakenne voi tehdä sen, missä se on parhaimmillaan.
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);
}
}Pikatarkistus
Vertailkaa näitä kahta rakennetta.
Kertaus
Paikallisilla funktioilla ja lambda-lausekkeilla on paljon yhteistä, mutta ne eroavat toisistaan tärkeillä tavoilla.
- Paikalliset funktiot voivat olla rekursiivisia ja geneerisiä, ja ne voivat käyttää
out/ref-parametreja. - Suoraan kutsuttuina ne välttävät delegaattien ja sulkeumien allokoinnit.
- Lambda-lausekkeet ovat tiiveimmillään suoraan LINQ:n kaltaisille metodeille annettavina argumentteina.
- Valitkaa käyttötarkoituksen perusteella: nimetty uudelleenkäytettävä apufunktio vai lyhyt inline-toiminta.
Opi C# tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 93
- Oppitunnit
- 346
Usein kysytyt kysymykset
Onko oppitunti ”Paikalliset funktiot ja lambdat” ilmainen?
Kyllä – oppitunnin ”Paikalliset funktiot ja lambdat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Paikalliset funktiot ja lambdat”?
Valitkaa paikallisten funktioiden ja lambdojen välillä. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Paikalliset funktiot ja lambdat”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?
Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Paikallisten funktioiden määrittely
- Sulkeumat ja kaapatut muuttujat
- Staattiset paikalliset funktiot
- Paikalliset funktiot ja lambdat