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ściowyint→ typ zwracanyx => 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
| Cecha | Func | Action |
| Zwraca wartość | ✔ tak | ❌ nie |
| Użycie | transformacje | side-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(...)→ przyjmujeFunc<T, bool>OrderBy(...)→ przyjmujeFunc<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ż
- C# Podstawy Programowania: Twój Pierwszy Krok w Świat Kodowania
- AI w .NET: Zostań Architektem Inteligentnych Aplikacji!
- C# Clean Architecture w Praktyce
- C# – Zbuduj Własnego Tetrisa! Kompletny Przewodnik
- 7 Dniowe Wyzwanie C# Tic Tac Toe
- C# Zbuduj Profesjonalny Portal Randkowy od Podstaw!
📣 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!!!

