1. Wprowadzenie do C#
  2. Szybki start
  3. Pierwszy program
  4. Komentarze
  5. Typy danych
  6. Zmienne
  7. Pola
  8. Właściwości
  9. Stałe
  10. Metody
  11. Instrukcje warunkowe
  12. Pętle
  13. Tablice
  14. Kolekcje
  15. Klasy
  16. Dziedziczenie
  17. Polimorfizm
  18. Konwersja typów
  19. Właściwości klasy String
  20. Typy wyliczeniowe
  21. Interfejsy
  22. Klasy statyczne
  23. Klasy Abstrakcyjne
  24. Przestrzenie nazw
  25. Wyjątki
  26. Typy generyczne
  27. JSON
  28. XML
  29. Podsumowanie

Typy generyczne

Typy generyczne w języku C# pozwalają na tworzenie klas, metod i interfejsów, które mogą przyjmować różne typy danych jako argumenty. Dzięki temu możemy napisać ogólniejszy kod, który będzie mógł być użyty z różnymi typami danych, bez konieczności jego duplikowania dla każdego z nich. Typy generyczne są oznaczane przez <> po nazwie klasy lub metody, w której są używane.

przykład klasy generycznej "Kolejka" w języku C#, która pozwala na przechowywanie elementów w kolejności FIFO (First In First Out).

								
using System;

class Program
{
    static void Main(string[] args)
    {
        Kolejka<int> kolejka = new Kolejka<int>(3);

        kolejka.Dodaj(1);
        kolejka.Dodaj(2);
        kolejka.Dodaj(3);

        Console.WriteLine(kolejka.Pobierz());
        Console.WriteLine(kolejka.Pobierz());
        Console.WriteLine(kolejka.Pobierz());
    }
}

class Kolejka<T>
{
    private T[] elementy;
    private int poczatek = 0;
    private int koniec = 0;

    public Kolejka(int rozmiar)
    {
        elementy = new T[rozmiar];
    }

    public void Dodaj(T element)
    {
        if (koniec == elementy.Length)
        {
            T[] noweElementy = new T[elementy.Length * 2];
            Array.Copy(elementy, noweElementy, elementy.Length);
            elementy = noweElementy;
        }

        elementy[koniec++] = element;
    }

    public T Pobierz()
    {
        if (Pusta)
        {
            throw new InvalidOperationException("Kolejka jest pusta");
        }

        T element = elementy[poczatek];
        elementy[poczatek++] = default(T);
        return element;
    }

    public bool Pusta => poczatek == koniec;
}