Func i Action

Func i Action w C# – lambdy i LINQ w praktyce

Func i Action w C# – lambdy i LINQ w praktyce

Jeśli używasz LINQ w C#, to korzystasz z Func, Action i wyrażeń lambda — nawet jeśli nie do końca rozumiesz, jak działają.
W tym artykule rozłożymy te mechanizmy na czynniki pierwsze i pokażę Ci je w praktycznym, produkcyjnym kontekście.
Bez definicji z dokumentacji — tylko konkret, kod i mental model, który naprawdę działa.


🧩 Czym jest Func w C#?

👉 Mental model (najważniejsze)

Func<> to delegat, który:

  • przyjmuje parametry
  • zwraca wartość

👉 Ostatni typ generyczny = typ zwracany


📌 Przykład

Func<int, int> kwadrat = x => x * x;

Co tu się dzieje?

  • int → parametr wejściowy
  • int → typ zwracany
  • x => x * x → lambda (implementacja metody)

👉 To jest równoważne:

int Kwadrat(int x)
{
    return x * x;
}

📌 Więcej parametrów

Func<int, int, int> dodawanie = (a, b) => a + b;

👉 Interpretacja:

  • a, b → wejście
  • wynik → int

⚠️ Edge case (często pomijany)

Typy w lambdzie są opcjonalne:

(a, b) => a + b

ale:

(int a, double b) => a + b // ❌ niezgodne z Func<int,int,int>

👉 Kompilator pilnuje zgodności sygnatury (strong typing)


⚡ Czym jest Action w C#?

👉 Kluczowa różnica

Action<>:

  • przyjmuje parametry
  • NIE zwraca wartości (void)

📌 Przykład

Action<int> wypisz = x => Console.WriteLine(x);

👉 Użycie:

wypisz(5);

🧠 Kiedy używać Action?

✔ logging
✔ operacje uboczne
✔ pipeline’y (middleware)


🔥 Func vs Action – różnice w praktyce

CechaFuncAction
Zwraca wartość✔ tak❌ nie
Użycietransformacjeside-effect
LINQ✔ głównie używany❌ rzadko

🧠 Skrót mentalny

👉 Func = coś liczysz
👉 Action = coś robisz


🧬 Wyrażenia lambda w C#

👉 Co to jest?

Lambda to:

skrócony zapis metody


📌 Najprostszy przykład

x => x * x

📌 Lambda z blokiem kodu

Func<int, int, int> dodawanie = (a, b) =>
{
    int wynik = a + b;
    return wynik;
};

⚠️ Kiedy używać block vs expression?

✔ expression → 90% przypadków (czytelność)
✔ block → gdy masz logikę


🔗 Lambdy + LINQ (realny use case)

To tutaj zaczyna się prawdziwa wartość.


📌 Przykład filtrowania i sortowania

var wynik = programisci
    .Where(p => p.Imie.Length == 5)
    .OrderBy(p => p.Imie);

🧠 Co się dzieje?

  • Where(...) → przyjmuje Func<T, bool>
  • OrderBy(...) → przyjmuje Func<T, TKey>

👉 Ty przekazujesz logikę jako parametr


🔥 Dlaczego to jest potężne?

Bo możesz budować pipeline:

.Where(...)
.OrderBy(...)
.Select(...)

👉 bez pisania własnych metod


⚠️ Performance i pułapki (production insight)

🧨 1. Closures (zamknięcia)

for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

👉 problem:

  • lambda „łapie” zmienną i
  • może prowadzić do błędów + alokacji

🧨 2. Nadmiar lambd w hot path

  • każda lambda = potencjalna alokacja
  • w API high-performance → ma znaczenie

✔ Best practice

  • używaj lambd swobodnie w logice biznesowej
  • profiluj tylko krytyczne miejsca

✅ Checklist – kiedy używać czego?

Użyj Func gdy:

  • przetwarzasz dane
  • używasz LINQ
  • potrzebujesz wyniku

Action gdy:

  • robisz logging
  • wykonujesz efekt uboczny
  • budujesz pipeline

Skorzystaj z lambdy gdy:

  • metoda jest krótka
  • chcesz przekazać logikę

🔗 Zobacz też


📣 Call To Action

Jeśli ten materiał pomógł Ci zrozumieć Func, Action i lambdy:

👉 zostaw komentarz – co było dla Ciebie największym „aha momentem”
👉 udostępnij artykuł komuś, kto walczy z LINQ


Zobacz także — powiązane artykuły

👉 MCP w .NET (C#) – jak zbudować serwer AI krok po kroku

👉 Tworzenie klas i obiektów w C# — kompletny przewodnik

👉 Pattern Matching w C# – switch expressions i type patterns

Dołącz do Listy VIP

I otrzymaj roadmapę Junior .NET Developer oraz najlepszą ofertę, gdy tylko ruszą zapisy!!!

Kontakt: mariuszjurczenko@dev-hobby.pl
Zero spamu. Możesz wypisać się w każdej chwili.

Dodaj komentarz