Dokumentacja C#
Zwięzła dokumentacja C# oparta na przykładach. Przeczytaj o zagadnieniu, zobacz kod i przećwicz go na ścieżce Coddy.
Zacznij ścieżkę C# z przewodnikiemPierwsze kroki
- Czym jest C#C# to statycznie typowany język ogólnego przeznaczenia od Microsoftu, który działa na .NET. Do czego służy, jak ma się do .NET, co dodała każda wersja i jak zbudowany jest program w C#.
- Hello WorldTwój pierwszy program w C# linia po linii: metoda Main, Console.WriteLine i Write, wczytywanie danych przez Console.ReadLine, komentarze, tworzenie i uruchamianie projektu przez dotnet CLI oraz instrukcje najwyższego poziomu.
- C# vs JavaC# i Java wyglądają podobnie i rozwiązują podobne problemy. Prawdziwe różnice to właściwości, typy wartościowe, generyki, LINQ kontra strumienie, async, wyjątki i ekosystemy wokół obu języków. Porównanie obok siebie, z kodem.
- C# vs C++C# to język zarządzany z odśmiecaczem pamięci; C++ kompiluje się do kodu natywnego i daje ręczną kontrolę nad pamięcią. Jak ta różnica przekłada się na bezpieczeństwo, wydajność, silniki gier, model budowania i trudność nauki każdego z nich.
- Przestrzenie nazw i usingJak przestrzenie nazw porządkują typy w C# i jak dyrektywa using je importuje: aliasy, using static, w pełni kwalifikowane nazwy, naprawianie niejednoznacznych odwołań, global using i przestrzenie nazw o zasięgu pliku.
Podstawy
- ZmienneJak deklarować zmienne i przypisywać im wartości w C#, kiedy var to dobry pomysł, a kiedy nie, jak działa zakres, czym różnią się const, readonly i static readonly, konwencje nazewnictwa i błąd nieprzypisanej zmiennej.
- Typy danychKażdy wbudowany typ C# z rozmiarem, zakresem i przyrostkiem literału, różnica między typami wartościowymi a referencyjnymi, dlaczego decimal to typ do pieniędzy, przepełnienie liczb całkowitych i checked oraz wartości domyślne.
- String na intJak zamienić string na int w C# przez int.Parse, int.TryParse i Convert.ToInt32, jak działają rzutowania niejawne i jawne, dlaczego rzutowanie double obcina część ułamkową, operatory as i is oraz dlaczego "1.5" może zostać odczytane jako 15.
- OperatoryOperatory C# i ich dokładne zachowanie: dzielenie całkowite, operator modulo z liczbami ujemnymi, inkrementacja i przypisanie złożone, porównania, logika ze skracaniem obliczeń, operatory bitowe, operatory null i tabela priorytetów.
- StringiJak działają stringi w C#: niemutowalność, Length i indeksowanie, porównywanie przez ==, Equals i string.Compare, znaki ucieczki, stringi dosłowne z @ i tekst wieloliniowy, surowe literały stringów, sprawdzanie null i pustych wartości oraz przechodzenie po znakach.
- SubstringJak działa String.Substring w C#: argumenty indeksu początkowego i długości, wyjątek ArgumentOutOfRangeException i jak go uniknąć, wycinanie tekstu wokół wyników IndexOf, pobieranie pierwszych lub ostatnich n znaków oraz operator zakresu z C# 8.
- Interpolacja stringówJak działa interpolacja stringów $"..." w C#: wyrażenia w nawiasach klamrowych, specyfikatory formatu takie jak F2, N0, C, D5 i X, wyrównanie w tabelach, escapowanie nawiasów klamrowych, string.Format i formatowanie złożone, dosłowne i surowe stringi interpolowane oraz formatowanie dla konkretnej kultury.
- Metody stringówMetody klasy String, których używasz na co dzień w C#: Split z kilkoma separatorami i opcjami, Replace, Contains i wyszukiwanie bez rozróżniania wielkości liter, IndexOf i LastIndexOf, StartsWith i EndsWith, Trim, ToUpper i ToLower, PadLeft, Join, Concat oraz odwracanie stringa.
- StringBuilderDlaczego wielokrotne łączenie stringów w pętli jest w C# wolne i jak naprawia to StringBuilder: Append, AppendLine, AppendFormat, Insert, Remove, Replace, pojemność oraz kiedy lepszym wyborem jest zwykła konkatenacja albo string.Join.
- Liczby losoweJak losować liczby w C# za pomocą klasy Random: Next i jej wyłączna górna granica, losowe liczby double w zakresie, ziarno dla powtarzalnych wyników, losowanie elementu, tasowanie listy, pułapka new Random w pętli i kryptograficznie bezpieczne liczby.
- DateTimePraca z datami i czasem w C#: tworzenie wartości DateTime, Now a UtcNow a Today, dodawanie dni i miesięcy, odejmowanie dające TimeSpan, TotalHours a Hours, porównywanie dat, DayOfWeek, parsowanie przez ParseExact i TryParse, DateTimeOffset i DateOnly.
- Formatowanie DateTimeJak sformatować DateTime jako napis w C#: standardowe ciągi formatu (d, D, o, s, u, t), wzorce niestandardowe takie jak yyyy-MM-dd HH:mm:ss, pełna tabela specyfikatorów, wpływ kultury na wynik, zapis ISO 8601 z "o" oraz pomyłki mm zamiast MM i hh zamiast HH.
Przepływ sterowania
- if elseJak działają if, else if i else w C#: dlaczego warunki muszą być typu bool, łączenie testów przez &&, || i !, kiedy nawiasy klamrowe mają znaczenie, klauzule ochronne zamiast głębokiego zagnieżdżania oraz błędy = zamiast == i zbędnego średnika.
- Instrukcja switchJak działa instrukcja switch w C#: switch na wartościach int, string, char i enum, dlaczego każdy case potrzebuje break (błąd CS0163), łączenie etykiet case dla kilku wartości, goto case, default, wielkość liter w stringach oraz etykiety case ze wzorcami i when.
- Wyrażenie switchWyrażenie switch z C# 8 zamienia wartość na wynik za pomocą ramion ze wzorcami zamiast case i break. Składnia, discard _, wzorce właściwości, krotek i relacyjne, and/or/not, warunki when, ostrzeżenia o niepełnym pokryciu i SwitchExpressionException, z odpowiednikami w C# 7 do uruchomienia.
- Operator trójargumentowyOperator warunkowy C# condition ? a : b wybiera jedną z dwóch wartości. Jak jest obliczany, dlaczego obie gałęzie potrzebują wspólnego typu (CS0173) i jakie rzutowanie to naprawia, zagnieżdżone operatory trójargumentowe, nawiasy w interpolacji stringów oraz kiedy lepiej wyrażają to ?? i ?.
- Pętla forJak działa pętla for w C#: inicjalizator, warunek i iterator, odliczanie w dół i krok, kilka zmiennych pętli, przechodzenie po tablicy przez indeks, pętle zagnieżdżone, for(;;) oraz błędy o jeden i usuwanie elementów w trakcie iteracji.
- Pętla foreachJak działa foreach w C#: przechodzenie po tablicach, listach, stringach i słownikach (KeyValuePair i dekonstrukcja), uzyskanie indeksu, dlaczego zmienna pętli jest tylko do odczytu, wyjątek InvalidOperationException "Collection was modified" i sposoby naprawy oraz czego potrzebuje typ, aby działał z foreach.
- Pętla whileJak działają pętle while i do while w C#: warunek sprawdzany przed ciałem albo po nim, wczytywanie danych do wartości wartowniczej lub do końca wejścia, while (true) z break oraz błędy nieskończonej pętli, na które łatwo się nadziać.
- break i continueJak działają break, continue i goto w C#: wcześniejsze zakończenie pętli, pominięcie iteracji, break wewnątrz switch, trzy sposoby wyjścia z pętli zagnieżdżonych (flaga, goto albo metoda z return) oraz błąd nieskończonej pętli przez continue w while.
Metody i delegaty
- MetodyJak deklarować i wywoływać metody w C#: typy zwracane i void, parametry, metody z ciałem wyrażeniowym, zwracanie kilku wartości w krotce, przeciążanie, tablice params, metody statyczne i instancyjne, metoda Main, rekurencja i funkcje lokalne.
- Parametry opcjonalneJak działają parametry opcjonalne i argumenty nazwane w C#: wartości domyślne i zasada stałej czasu kompilacji, kolejność parametrów, pomijanie argumentów po nazwie, parametry opcjonalne a przeciążenia, atrybuty informacji o wywołującym i pułapka wersjonowania wartości domyślnych wkompilowanych w wywołującego.
- ref i outJak działają parametry ref, out i in w C#: przekazywanie zmiennej zamiast kopii, out dla dodatkowych wyników i wzorzec TryParse, out var, parametry in tylko do odczytu, zasady pewnego przypisania i to, co się zmienia, gdy argument jest typem referencyjnym.
- Wyrażenia lambdaJak działają wyrażenia lambda w C#: składnia => we wszystkich formach, przechowywanie lambd w Func i Action, przekazywanie ich do metod i LINQ, lambdy z blokiem instrukcji, domknięcia nad przechwyconymi zmiennymi i błąd przechwycenia w pętli for, którego nie ma foreach.
- DelegatyCzym jest delegat w C# i jak go używać: deklarowanie typu delegatu, tworzenie go z metody, lambdy lub metody anonimowej, wywoływanie, delegaty jako callbacki, delegaty multicast z += i -=, sprawdzanie null przez ?.Invoke oraz związek delegatów z Func, Action i zdarzeniami.
- Func i ActionJak działają Func i Action w C#: Func<T, TResult> dla funkcji zwracających wartość, Action<T> dla tych, które nic nie zwracają, Predicate i Comparison, przekazywanie i zwracanie funkcji, słownik poleceń, lambdy async i kiedy lepiej zadeklarować własny delegat.
- ZdarzeniaJak działają zdarzenia w C#: deklarowanie zdarzenia z EventHandler i EventHandler<T>, własne klasy EventArgs, subskrybowanie i anulowanie subskrypcji przez += i -=, bezpieczne wywoływanie zdarzenia przez ?.Invoke, dlaczego zdarzenie jest lepsze niż publiczne pole delegatu i wyciek pamięci przez zapomniane anulowanie subskrypcji.
- Metody rozszerzająceJak działają metody rozszerzające w C#: metoda static w klasie static z this przy pierwszym parametrze, wywoływanie jej jak metody instancji, rozszerzanie string, enumów i IEnumerable<T>, jak zbudowano na nich LINQ, dlaczego metody instancji wygrywają, odbiorca null i potrzebna dyrektywa using.
Kolekcje i LINQ
- TabliceTablica w C# to blok elementów jednego typu o stałym rozmiarze. Dowiedz się, jak deklarować i inicjalizować tablice, odczytywać Length, sortować i przeszukiwać je klasą Array, bezpiecznie je kopiować oraz pracować z tablicami 2D i postrzępionymi.
- ListList<T> to rozszerzalna tablica w C#. Zobacz, jak utworzyć listę, dodawać i wstawiać elementy, usuwać według wartości, indeksu lub warunku, wyszukiwać przez Contains i Find, sortować według właściwości i uniknąć błędu przy zmienianiu listy wewnątrz foreach.
- DictionaryDictionary<TKey, TValue> mapuje klucze na wartości z szybkim wyszukiwaniem. Dowiedz się, jak dodawać i aktualizować wpisy, bezpiecznie odczytywać je przez TryGetValue, iterować po wpisach KeyValuePair, liczyć wystąpienia, ignorować wielkość liter w kluczach i utrzymywać posortowane klucze przez SortedDictionary.
- HashSetHashSet<T> przechowuje unikalne elementy i odpowiada na Contains w stałym czasie. Zobacz, jak Add zgłasza duplikaty, jak usunąć duplikaty z listy, jak wykonać sumę, część wspólną i różnicę zbiorów oraz jak sprawić, by zbiór porównywał twoje obiekty według wartości.
- QueueQueue<T> to kolekcja typu first in, first out: elementy wychodzą w kolejności, w jakiej przyszły. Poznaj Enqueue, Dequeue i Peek, wyjątek pustej kolejki i TryDequeue, przeszukiwanie wszerz z kolejką oraz to, kiedy sięgnąć po ConcurrentQueue albo PriorityQueue.
- StackStack<T> to kolekcja typu last in, first out: element dodany najpóźniej wychodzi pierwszy. Poznaj Push, Pop i Peek, wyjątek pustego stosu i TryPop, powód, dla którego stos jest przeglądany w odwrotnej kolejności, oraz dwa klasyczne zastosowania: historię cofania i sprawdzanie zbalansowanych nawiasów.
- KrotkiKrotka w C# łączy kilka wartości w jedną bez deklarowania typu. Poznaj składnię krotek wartościowych, nazwane elementy, zwracanie wielu wartości z metody, dekonstrukcję przez var (a, b), krotki jako klucze słownika oraz czym ValueTuple różni się od starszego System.Tuple.
- LINQLINQ dodaje operatory zapytań do każdej kolekcji w C#. Poznaj składnię metod i składnię zapytań, filtrowanie przez Where, projekcję przez Select, sortowanie przez OrderBy i ThenBy, grupowanie przez GroupBy, pułapkę First a FirstOrDefault, agregacje i to, jak wykonanie odroczone zmienia moment uruchomienia zapytania.
- IEnumerable i yieldIEnumerable<T> to interfejs stojący za foreach i LINQ, a yield return to najprostszy sposób, żeby go zaimplementować. Zobacz, jak IEnumerable ma się do ICollection i List, jak krok po kroku działa metoda iteratora, yield break, sekwencje nieskończone i pułapki leniwego wartościowania.
Klasy i typy
- Klasy i obiektyJak zadeklarować klasę w C#, dodać do niej pola i metody, tworzyć obiekty przez new i co oznacza, że klasa jest typem referencyjnym: współdzielone obiekty, null i NullReferenceException, ToString oraz inicjalizatory obiektów.
- KonstruktoryJak działają konstruktory w C#: niejawny konstruktor domyślny i kiedy znika, konstruktory z parametrami i przeciążone, łączenie w łańcuch przez this(...) i base(...), kolejność wykonania, konstruktory statyczne i prywatne oraz konstruktory podstawowe z C# 12.
- WłaściwościJak działają właściwości w C#: akcesory get i set nad polem pomocniczym, właściwości automatyczne, private set i właściwości tylko do odczytu, właściwości obliczane, walidacja w setterach oraz słowa kluczowe init i required z C# 9 i 11.
- Słowo kluczowe staticCo oznacza static w C#: składowe należące do typu, a nie do obiektu, stan współdzielony przez instancje, metody i klasy statyczne, konstruktory statyczne, const a static readonly, using static i błąd CS0120.
- Modyfikatory dostępuSześć modyfikatorów dostępu w C# (public, private, protected, internal, protected internal, private protected), na co każdy pozwala, jakie są wartości domyślne, gdy nie napiszesz żadnego, i jakie błędy kompilatora powodują.
- DziedziczenieJak działa dziedziczenie klas w C#: dziedziczenie przez dwukropek, co jest dziedziczone, a co nie, wywołanie klasy bazowej przez base, virtual i override, ukrywanie przez new (i wynik, który zaskakuje wszystkich), sealed, polimorfizm oraz rzutowanie w górę i w dół hierarchii.
- Klasy abstrakcyjneCzym jest klasa abstrakcyjna w C#: klasa bazowa, której nie można zinstancjonować i która może deklarować abstrakcyjne składowe, obowiązkowe do zaimplementowania w klasach pochodnych. Omawia metody i właściwości abstrakcyjne, konstruktory, wzorzec template method oraz to, kiedy lepiej wybrać interfejs.
- InterfejsyJak działają interfejsy w C#: deklarowanie, implementowanie w klasach i strukturach, używanie interfejsu jako typu, implementowanie kilku naraz, jawna implementacja, interfejsy frameworka, które implementuje się najczęściej (IComparable<T>, IEnumerable<T>, IDisposable), oraz domyślne metody interfejsów z C# 8.
- StrukturyJak działają struktury w C#: semantyka wartości i kopiowanie przy przypisaniu, błąd modyfikacji w List<T>, zasady konstruktorów, równość, boxing, readonly struct i record struct oraz porównanie struct i class ze wskazówkami, kiedy struktura to dobry wybór.
- EnumyJak działają enumy w C#: deklarowanie nazwanych stałych, bazowe wartości całkowite i rzutowanie, konwersja enuma na napis i napisu na enum przez Parse i TryParse, wypisanie wszystkich wartości, [Flags] z operatorami bitowymi i HasFlag, switch na enumie oraz obsługa niezdefiniowanych wartości.
- RekordyCzym są rekordy w C# (C# 9 i nowsze): składnia pozycyjna, składowe generowane przez kompilator, równość oparta na wartościach, niedestrukcyjne kopie z with, wbudowany ToString, record struct z C# 10, dziedziczenie między rekordami i odpowiednik w postaci ręcznie napisanej klasy.
- Typy generyczneJak działają typy generyczne w C#: pisanie klas i metod generycznych z parametrami typu, wnioskowanie typów, ograniczenia przez where (class, struct, new(), klasy bazowe, interfejsy), default(T), składowe statyczne osobno dla każdego typu i kowariancja z IEnumerable<out T>.
- Typy nullableWszystko o null w C#: typy wartościowe nullable (int?, Nullable<T>) z HasValue, Value i GetValueOrDefault, operatory ?? i ??=, operator warunkowy ?., sprawdzanie null i nullable reference types (string?) z C# 8.
- Pattern matchingJak działa dopasowywanie wzorców w C#: operator is z wzorcami typu i stałej, instrukcje switch z wzorcami w case i when, wyrażenia switch, wzorce właściwości, krotek i pozycyjne, wzorce relacyjne i logiczne (and, or, not), wzorce list oraz w której wersji C# pojawił się każdy z nich.
Wyjątki
- Try Catchtry, catch i finally to sposób obsługi wyjątków w C#. Dowiedz się, jak wyjątek wędruje w górę stosu wywołań, jak łapać konkretne typy wyjątków we właściwej kolejności, filtrować przez when, sprzątać w finally, rzucać ponownie przez throw; bez utraty śladu stosu i których wyjątków nie łapać.
- Rzucanie wyjątkówJak i kiedy rzucać wyjątki w C#. Poznaj instrukcję throw, który wbudowany typ wyjątku pasuje do którego błędu, wyrażenia throw z ?? i ?:, metody pomocnicze ThrowIfNull oraz jak napisać własną klasę wyjątku z własnymi danymi i wyjątkiem wewnętrznym.
- Instrukcja usingInstrukcja using gwarantuje wywołanie Dispose na plikach, strumieniach, połączeniach i innych obiektach IDisposable, nawet gdy zostanie rzucony wyjątek. Dowiedz się, do czego się kompiluje, w jakiej kolejności obiekty są zwalniane, czym jest deklaracja using z C# 8 i jak zaimplementować IDisposable we własnej klasie.
Asynchroniczność i wątki
- Async i awaitasync i await pozwalają kodowi C# czekać na wolne operacje bez blokowania wątku. Zobacz, jak działa metoda asynchroniczna, czym są Task i Task<T>, jak uruchamiać niezależne operacje jednocześnie przez Task.WhenAll, jak działają wyjątki w kodzie asynchronicznym i dlaczego async void oraz .Result powodują błędy i zakleszczenia.
- TaskiTask to jednostka pracy asynchronicznej i równoległej w .NET. Poznaj Task.Run do pracy obciążającej procesor, odczyt wyników, łączenie tasków przez WhenAll i WhenAny, kontynuacje, anulowanie przez CancellationToken, czym Task różni się od Thread i kiedy lepiej pasuje Parallel.For.
- LockInstrukcja lock pozwala tylko jednemu wątkowi naraz wykonywać blok kodu. Zobacz, jak wyścig psuje licznik, napraw go za pomocą lock, dowiedz się, na jakim obiekcie blokować, użyj Interlocked do prostych liczników, unikaj zakleszczeń wynikających z kolejności blokad i sięgnij po SemaphoreSlim, gdy kod w środku używa await.
- TimerC# ma kilka klas timerów i każda działa inaczej. Dowiedz się, kiedy używać System.Threading.Timer, System.Timers.Timer, PeriodicTimer albo timera interfejsu, jak je uruchamiać i zatrzymywać, dlaczego callbacki działają w puli wątków i mogą się nakładać, dlaczego do timera musi prowadzić referencja i jak mierzyć upływ czasu przez Stopwatch.
Pliki, JSON i więcej
- Odczyt i zapis plikówJak zapisać i odczytać plik w C#: File.WriteAllText, ReadAllText, AppendAllText, WriteAllLines i ReadAllLines dla całych plików, StreamWriter i StreamReader dla dużych, ścieżki przez Path.Combine, katalogi, kodowanie znaków i wyjątki, które kod pracujący na plikach musi obsłużyć.
- JSONJak pracować z JSON w C# przez System.Text.Json: JsonSerializer.Serialize i Deserialize, camelCase i wcięcia, atrybuty takie jak JsonPropertyName i JsonIgnore, enumy jako stringi, odczyt JSON bez klas przez JsonDocument i JsonNode, błędy oraz porównanie z Newtonsoft.Json.
- RegexJak używać wyrażeń regularnych w C# z System.Text.RegularExpressions: IsMatch, Match i Matches, grupy numerowane i nazwane, Replace z podstawieniami i lambdą, Split, RegexOptions, stringi dosłowne dla wzorców, walidacja danych, limity czasu i atrybut GeneratedRegex z .NET 7.
- Refleksja i atrybutyJak działa refleksja w C#: obiekty Type z typeof i GetType, odczyt i ustawianie właściwości, wywoływanie metod po nazwie, tworzenie instancji oraz atrybuty: wbudowane, takie jak Obsolete, deklarowanie własnych i odczytywanie ich w czasie działania. Do tego koszt refleksji.