W języku C# szablon List umożliwia korzystanie z listy. Z definicji obiektu kolekcji wynika, że jego elementami mogą być: List<int> wykaz = new List<int>();
Jeżeli chodzi o kolekcje generyczne w C#, to List<int> jest przykładem bardzo konkretnego zastosowania. Ten zapis oznacza, że tworzymy listę, której elementami mogą być wyłącznie liczby całkowite – dokładnie takie, jakie reprezentuje typ int w .NET (czyli 32-bitowe liczby całkowite ze znakiem). Wynika to z idei generyczności: typ podany w nawiasach ostrych (<int>) precyzyjnie narzuca typ przechowywanych danych. To daje nam bezpieczeństwo typów, na które zwracają uwagę wszyscy programiści C# – nie da się przez pomyłkę dodać tam np. napisu czy obiektu innego typu. Z mojego doświadczenia mogę powiedzieć, że to bardzo upraszcza życie, bo kompilator od razu wychwyci próby niewłaściwego użycia. Praktycznie, gdy tworzysz List<int>, możesz ją wykorzystać np. do przechowywania identyfikatorów, wyników testów, liczb losowych – wszędzie tam, gdzie operujesz właśnie na liczbach całkowitych. Warto dodać, że generyczność jest jednym z filarów nowoczesnych języków, pozwalając pisać kod elastyczny i bezpieczny zarazem. Trochę jak z pudełkiem na śrubki: jak wrzucisz inne rzeczy, to od razu się pogubisz i zrobi się bałagan. Tutaj jest bardzo jasno – List<int> to zawsze lista liczb całkowitych i już. Dobre praktyki branżowe podpowiadają, żeby zawsze stosować jak najbardziej precyzyjne typy w generycznych kolekcjach, bo to ułatwia późniejsze utrzymanie kodu i ogranicza potencjalne błędy.
W C# kolekcje generyczne typu List<> są jednym z podstawowych narzędzi do zarządzania zbiorem danych o określonym typie. Typ elementów w takiej liście nie jest przypadkowy ani dowolny, tylko wynika bezpośrednio z tego, co wpiszemy w nawiasach ostrych. Wiele osób na początku ulega mylnemu przekonaniu, że List<> może przechowywać elementy o nieokreślonym typie, co jest nieporozumieniem – właściwie tylko List<object> pozwala na taką elastyczność, ale i wtedy każda operacja na elementach wymaga rzutowania. Jeśli natomiast chodzi o liczby rzeczywiste, to one są reprezentowane przez typy double lub float, więc List<int> kompletnie się do tego nie nadaje – jeśli spróbujesz przechować tam np. 3.14, kompilator od razu zaprotestuje. Zdarza się, że ktoś sądzi, iż List<int> może przechowywać inne kolekcje typu List, ale to również nieporozumienie. Wtedy należałoby użyć List<List<int>> lub List<List<T>>, jeśli chcemy mieć listę list, a nie pojedynczych wartości. Typowe błędy wynikają tu moim zdaniem z nieznajomości, jak działa generyczność i jak ściśle typowana jest ta kolekcja. Może się to wydawać ograniczające, ale na co dzień ułatwia życie i zmniejsza ryzyko błędów już na etapie kompilacji. Dobrym nawykiem jest więc zawsze przyglądać się, jaki typ przypisujemy w List<>, bo to rzutuje na wszystkie operacje, jakie potem wykonamy na tej liście. Kluczowe jest, żeby dobrze rozumieć typy w C# i korzystać z nich świadomie, bo to podstawa solidnego i bezpiecznego kodu, zgodnie z praktykami profesjonalnych zespołów programistycznych.