Podstawy języka C#

Wprowadzenie do C#

C# to język programowania opracowany przez firmę Microsoft, używany głównie do tworzenia aplikacji na platformę .NET. Jego główne cechy to:

  • Obiektowość: programowanie oparte na klasach i obiektach
  • Silnie typowany: zmienne mają określone typy, co pomaga unikać błędów
  • Czytelność: składnia języka jest zbliżona do innych popularnych języków, np. Java czy C++
  • Zarządzanie pamięcią: automatyczne dzięki Garbage Collector
  • Wieloplatformowość: działa na Windows, Linux, macOS dzięki .NET Core/.NET 5+

Historia i wersje C#

  • 2000: C# 1.0 – pierwsza wersja
  • 2024: C# 12 – najnowsza wersja z nowoczesnymi funkcjami
  • Twórca: Anders Hejlsberg (również twórca TypeScript)

Gdzie używamy C#?

  • Aplikacje desktopowe (WPF, WinUI)
  • Aplikacje webowe (ASP.NET)
  • Aplikacje mobilne (Xamarin, .NET MAUI)
  • Gry (Unity)
  • Usługi w chmurze (Azure)

Instrukcje i przepływ wykonania

Instrukcje to pojedyncze polecenia, które mówią programowi, co ma zrobić. Każda instrukcja w C# zwykle kończy się średnikiem (;).

Rodzaje instrukcji:

  1. Deklaracja i inicjalizacja zmiennej
  2. Przypisanie wartości do zmiennej
  3. Wywołanie metody (np. Console.WriteLine("Tekst");)
  4. Instrukcje warunkowe (np. if, else)
  5. Instrukcje pętli (np. for, while)
  6. Instrukcje skoku (return, break, continue)

Przepływ wykonania

Przepływ wykonania to kolejność, w jakiej instrukcje są wykonywane przez program. Domyślnie w C# instrukcje wykonywane są sekwencyjnie – od góry do dołu, ale możemy sterować przepływem za pomocą instrukcji warunkowych i pętli.

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Zaczynamy program...");        // 1. Instrukcja
        int liczba = 10;                                  // 2. Instrukcja: deklaracja i przypisanie
        liczba = liczba + 5;                              // 3. Instrukcja: zmiana wartości zmiennej
        Console.WriteLine("Wartość liczby: " + liczba);   // 4. Instrukcja: wyświetlenie
        
        // Przykład prostego sterowania przepływem
        if (liczba > 10)                                  // 5. Instrukcja warunkowa
        {
            Console.WriteLine("Liczba jest większa od 10"); // 6. Instrukcja warunkowa
        }
    }
}

Bloki kodu

Bloki kodu to grupy instrukcji otoczone nawiasami klamrowymi {}. Określają one zasięg zmiennych i grupują powiązane instrukcje.

{
    // To jest blok kodu
    int lokalnaZmienna = 5;
    Console.WriteLine(lokalnaZmienna);
} // lokalnaZmienna przestaje istnieć tutaj

Identyfikatory i zasady nazewnictwa

Identyfikatory to nazwy, które nadajemy zmiennym, metodom, klasom, itp. w kodzie.

Zasady techniczne (obowiązkowe):

  • Mogą zawierać litery, cyfry i znak podkreślenia _
  • Nie mogą zaczynać się od cyfry
  • Nie mogą być słowami kluczowymi
  • Wielkość liter ma znaczenie (nazwaNazwa)

Identyfikatory – podstawowe zasady

Identyfikatory to nazwy, które nadajemy zmiennym, metodom, klasom, itp. w kodzie.

Zasady techniczne (obowiązkowe):

  • Mogą zawierać litery, cyfry i znak podkreślenia _
  • Nie mogą zaczynać się od cyfry
  • Nie mogą być słowami kluczowymi
  • Wielkość liter ma znaczenie (nazwaNazwa)

Przykłady prawidłowych i nieprawidłowych nazw:

// ✅ Prawidłowe nazwy
string imieUzytkownika;
int liczba1;
bool _czyWlaczony;

// ❌ Nieprawidłowe nazwy
// int 123liczba;     // Zaczyna się od cyfry
// string class;      // Słowo kluczowe
// bool ma-wiek;      // Zawiera myślnik

Uwaga: Szczegółowe konwencje nazewnictwa omówimy w osobnej lekcji poświęconej wyłącznie tym zagadnieniom.

Deklaracja i inicjalizacja zmiennych

Podstawy pracy ze zmiennymi:

Deklaracja – poinformowanie kompilatora o typie i nazwie zmiennej:

int liczba;          // Zmienna zadeklarowana, ale nieinicjalizowana

Inicjalizacja – nadanie wartości zmiennej:

int liczba = 10;     // Deklaracja + inicjalizacja w jednej linii

Przypisanie – zmiana wartości istniejącej zmiennej:

liczba = 5;          // Nowa wartość dla istniejącej zmiennej

Różne sposoby deklaracji:

using System;

class Program
{
    static void Main(string[] args)
    {
        // 1. Klasyczna deklaracja z inicjalizacją
        int wiek = 20;
        
        // 2. Deklaracja, potem przypisanie
        string imie;
        imie = "Anna";
        
        // 3. Wnioskowanie typu z 'var'
        var miasto = "Warszawa";        // Kompilator wywnioskuje: string
        var temperatura = 25.5;         // Kompilator wywnioskuje: double
        
        // 4. Deklaracja wielu zmiennych tego samego typu
        int x = 10, y = 20, z = 30;
        
        // 5. Stałe - wartości niezmiennych
        const double PI = 3.14159;
        const string NAZWA_APLIKACJI = "Moja Aplikacja";
        
        // 6. Wartości domyślne
        int nieustawionaLiczba = default(int);    // 0
        string nieustawionyTekst = default(string); // null
        
        // Wyświetlenie wartości
        Console.WriteLine($"Imię: {imie}");
        Console.WriteLine($"Wiek: {wiek}");
        Console.WriteLine($"Miasto: {miasto}");
        Console.WriteLine($"Temperatura: {temperatura}°C");
        Console.WriteLine($"Współrzędne: x={x}, y={y}, z={z}");
        Console.WriteLine($"PI = {PI}");
    }
}

Zasięg zmiennych (Scope):

class Program
{
    static int zmiennaKlasowa = 100;    // Dostępna w całej klasie
    
    static void Main(string[] args)
    {
        int zmiennaMetody = 50;         // Dostępna w całej metodzie Main
        
        if (true)
        {
            int zmiennaBloku = 25;      // Dostępna tylko w tym bloku
            Console.WriteLine(zmiennaKlasowa);  // ✅ Dostępna
            Console.WriteLine(zmiennaMetody);   // ✅ Dostępna
            Console.WriteLine(zmiennaBloku);    // ✅ Dostępna
        }
        
        // Console.WriteLine(zmiennaBloku);  // ❌ Błąd! Poza zasięgiem
    }
}

Komentarze

Komentarze służą do wyjaśniania kodu lub tymczasowego wyłączania fragmentów. Kompilator je ignoruje.

Rodzaje komentarzy:

1. Komentarz jednolinijkowy (//)

// To jest komentarz jednolinijkowy
int liczba = 10;    // Komentarz na końcu linii

2. Komentarz wielolinijkowy (/* */)

/* 
   To jest komentarz
   wielolinijkowy - może
   zajmować wiele linii
*/
int wynik = a + b; /* również w środku linii */

3. Komentarze dokumentacyjne (///)

/// <summary>
/// Oblicza sumę dwóch liczb całkowitych
/// </summary>
/// <param name="a">Pierwsza liczba</param>
/// <param name="b">Druga liczba</param>
/// <returns>Suma liczb a i b</returns>
public int Dodaj(int a, int b)
{
    return a + b;
}

Dobre praktyki komentowania:

// ✅ Dobry komentarz - wyjaśnia DLACZEGO, nie CO
// Używamy algorytmu QuickSort ze względu na dużą ilość danych
Array.Sort(duzeZbior);

// ❌ Zły komentarz - opisuje oczywiste
// Przypisuje wartość 5 do zmiennej liczba
int liczba = 5;

// ✅ Dobry komentarz - ostrzeżenie lub ważna informacja
// UWAGA: Ta metoda modyfikuje oryginalną tablicę!
public void PosortujTablice(int[] tablica)

// ✅ Dobry komentarz - TODO dla przyszłych zmian
// TODO: Dodać walidację danych wejściowych
public void PrzetworzDane(string dane)

Pełna lista słów kluczowych C#:

abstract, as, base, bool, break, byte, case, catch, char, checked, 
class, const, continue, decimal, default, delegate, do, double, else, 
enum, event, explicit, extern, false, finally, fixed, float, for, 
foreach, goto, if, implicit, in, int, interface, internal, is, lock, 
long, namespace, new, null, object, operator, out, override, params, 
private, protected, public, readonly, ref, return, sbyte, sealed, 
short, sizeof, stackalloc, static, string, struct, switch, this, 
throw, true, try, typeof, uint, ulong, unchecked, unsafe, ushort, 
using, virtual, void, volatile, while

Ćwiczenia praktyczne

Ćwiczenie 1: Zmienne i komentarze ✨

Utwórz nowy projekt konsolowy i napisz program, który:

  1. Zadeklaruj zmienną typu string o nazwie imie i przypisz do niej swoje imię
  2. Zadeklaruj zmienną typu int o nazwie wiek i przypisz do niej swój wiek
  3. Zadeklaruj zmienną typu string o nazwie miasto i przypisz swoją miejscowość
  4. Wypisz wszystkie wartości w konsoli używając interpolacji stringów
  5. Dodaj odpowiednie komentarze

Ćwiczenie 2: Kalkulator prostych operacji 🧮

Napisz program, który:

  1. Deklaruje dwie zmienne liczbowe
  2. Wykonuje podstawowe operacje matematyczne
  3. Wyświetla wyniki z opisami