C# Cheat Sheet: ściąga z C#
Ostatnia aktualizacja
Hello World i struktura programu
Instrukcje najwyższego poziomu (od .NET 6) pozwalają pominąć szablonową klasę.
| Element | Kod |
|---|---|
| Program najwyższego poziomu | Console.WriteLine("Hello, World!"); |
| Import przestrzeni nazw | using System; |
| Klasyczny punkt wejścia | static void Main(string[] args) { ... } |
| Wypisanie linii | Console.WriteLine("text"); |
| Odczyt linii | string s = Console.ReadLine(); |
| Interpolacja łańcuchów | Console.WriteLine($"Hi {name}"); |
| Komentarze | // line i /* block */ |
Typy danych
| Typ | Opis |
|---|---|
int | 32-bitowa liczba całkowita ze znakiem |
long | 64-bitowa liczba całkowita ze znakiem |
double / float | Liczby zmiennoprzecinkowe |
decimal | Liczba dziesiętna wysokiej precyzji (pieniądze) |
bool | true lub false |
char | Pojedynczy znak Unicode |
string | Niemutowalny tekst |
var | Kompilator sam ustala typ |
int? | Typ wartościowy dopuszczający null |
Zmienne
| Operacja | Składnia |
|---|---|
| Deklaracja i inicjalizacja | int x = 5; |
| Wnioskowanie typu | var name = "Ada"; |
| Stała | const double Pi = 3.14159; |
| Pole tylko do odczytu | readonly int id; |
| Referencja dopuszczająca null | string? maybe = null; |
| Operator ?? | var y = maybe ?? "default"; |
| Operator ?. | int? len = text?.Length; |
Sterowanie przepływem
| Instrukcja | Składnia |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Instrukcja switch | switch (n) { case 1: ...; break; default: ...; } |
| Wyrażenie switch | var s = n switch { 1 => "one", _ => "other" }; |
| Pętla while | while (i < n) { ... } |
| Pętla do-while | do { ... } while (i < n); |
| Pętla for | for (int i = 0; i < n; i++) { ... } |
| Pętla foreach | foreach (var item in list) { ... } |
| Break / continue | break; wychodzi z pętli, continue; przechodzi do następnej iteracji |
Metody
| Operacja | Składnia |
|---|---|
| Definicja metody | int Add(int a, int b) { return a + b; } |
| Metoda w postaci wyrażenia | int Add(int a, int b) => a + b; |
| Bez wartości zwracanej | void Greet() { ... } |
| Parametr opcjonalny | int Pow(int b, int e = 2) { ... } |
| Argumenty nazwane | Pow(b: 2, e: 3); |
| Parametr out | bool TryParse(string s, out int n) { ... } |
| Metoda statyczna | static int Square(int x) => x * x; |
| Wyrażenie lambda | Func<int, int> f = x => x * 2; |
Klasy i OOP
| Operacja | Składnia |
|---|---|
| Definicja klasy | class Dog { ... } |
| Właściwość automatyczna | public string Name { get; set; } |
| Właściwość tylko do odczytu | public int Id { get; } |
| Konstruktor | public Dog(string name) { Name = name; } |
| Utworzenie obiektu | var d = new Dog("Rex"); |
| Dziedziczenie | class Puppy : Dog { ... } |
| Interfejs | interface IRunnable { void Run(); } |
| Nadpisanie metody | public override void Speak() { ... } |
| Rekord (niemutowalny) | record Point(int X, int Y); |
Kolekcje
Kolekcje generyczne z System.Collections.Generic.
| Typ | Zastosowanie i przykład |
|---|---|
List<T> | Tablica dynamiczna: list.Add(1); list.Count; |
Dictionary<K, V> | Klucz-wartość: dict["a"] = 1; dict.ContainsKey("a"); |
HashSet<T> | Unikalne wartości: set.Add(5); set.Contains(5); |
Queue<T> | FIFO: q.Enqueue(x); q.Dequeue(); |
Stack<T> | LIFO: s.Push(x); s.Pop(); |
| Tablica | int[] nums = { 1, 2, 3 }; |
| Inicjalizator kolekcji | var l = new List<int> { 1, 2, 3 }; |
| Iteracja po słowniku | foreach (var kv in dict) { kv.Key; kv.Value; } |
LINQ
Płynne odpytywanie kolekcji; z System.Linq.
| Operacja | Składnia |
|---|---|
| Filtrowanie | nums.Where(n => n > 0) |
| Projekcja / mapowanie | nums.Select(n => n * 2) |
| Sortowanie | nums.OrderBy(n => n) / OrderByDescending(...) |
| Pierwsze dopasowanie | nums.First(n => n > 5) / FirstOrDefault(...) |
| Any / all | nums.Any(n => n < 0) / nums.All(n => n > 0) |
| Zliczenie dopasowań | nums.Count(n => n > 0) |
| Agregacja | nums.Sum(), nums.Max(), nums.Average() |
| Grupowanie | items.GroupBy(i => i.Category) |
| Materializacja | .ToList() / .ToArray() |
Popularne wzorce (właściwości, async)
| Wzorzec | Składnia |
|---|---|
| Metoda asynchroniczna | async Task<int> GetAsync() { ... } |
| Oczekiwanie na zadanie | var result = await GetAsync(); |
| Try / catch | try { ... } catch (Exception e) { ... } |
| Finally | finally { ... } wykonuje się zawsze |
| Using (zwalnianie zasobów) | using var file = File.OpenRead(path); |
| Formatowanie łańcuchów | $"Total: {amount:C}" |
| Klasa generyczna | class Box<T> { public T Value; } |
| Dopasowanie wzorców | if (obj is Dog d) { d.Bark(); } |
Najczęściej używana składnia C#, kolekcje i zapytania LINQ na jednej stronie. Ten C# cheat sheet to szybka ściąga do pisania w C#: typy danych, sterowanie przepływem, klasy, kolekcje List/Dictionary, LINQ oraz wzorce właściwości i async typowe dla idiomatycznego kodu .NET.
Wszystko tutaj to standardowy C# na platformie .NET, który uruchomisz przez CLI dotnet. Skopiuj to, czego potrzebujesz, albo uruchom dowolny fragment w edytorze online C#, bez instalowania SDK.
C# cheat sheet: najczęstsze pytania
Czy ten C# cheat sheet jest darmowy?
Czym różnią się typy wartościowe od referencyjnych w C#?
int, double, bool, struct, enum) przechowują dane bezpośrednio i są kopiowane przy przypisaniu lub przekazaniu do metody, więc zmiana kopii nie wpływa na oryginał. Typy referencyjne (class, string, tablice, List<T>) przechowują referencję do danych na stercie, więc dwie zmienne mogą wskazywać ten sam obiekt, a zmiana przez jedną jest widoczna przez drugą. string jest typem referencyjnym, ale zachowuje się jak niemutowalny.Czym jest LINQ i kiedy go używać?
Where, Select i OrderBy, które pozwalają filtrować, przekształcać i agregować kolekcje czytelnymi, łańcuchowymi wywołaniami zamiast ręcznych pętli. Używaj go wszędzie tam, gdzie inaczej trzeba by napisać pętlę budującą przefiltrowaną lub przekształconą listę: jest zwięzły i wyliczany leniwie, dopóki nie wywołasz ToList() albo nie zaczniesz iterować.