алг Документацияалгоритмический язык · C#

Шпаргалка по C#

Синтаксис C#, коллекции и запросы LINQ, которые нужны чаще всего, — на одной странице. Всё это стандартный C# на .NET.

Любой пример можно запустить в компиляторе — без установки SDK и Visual Studio.

Hello World и структура программы

Операторы верхнего уровня (с .NET 6) позволяют обойтись без шаблонного класса.

Элемент Код
Программа верхнего уровня Console.WriteLine("Hello, World!");
Импортировать пространство имён using System;
Классическая точка входа static void Main(string[] args) { ... }
Вывести строку Console.WriteLine("text");
Считать строку string s = Console.ReadLine();
Интерполяция строк Console.WriteLine($"Hi {name}");
Комментарии // строка и /* блок */
C#
using System;

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Как вас зовут? ");
        string name = Console.ReadLine();
        Console.WriteLine($"Привет, {name}!");
    }
}

Типы данных

Тип Описание
int 32-битное знаковое целое
long 64-битное знаковое целое
double / float Числа с плавающей точкой
decimal Десятичный тип высокой точности (деньги)
bool true или false
char Один символ Unicode
string Неизменяемый текст
var Компилятор выводит тип сам
int? Значимый тип, допускающий null

Диапазоны целых: byte 0…255, short ±32 767, int ±2,1 млрд, long ±9,2 ⋅ 10¹⁸.

Переменные

Операция Синтаксис
Объявить и инициализировать int x = 5;
Вывод типа var name = "Ada";
Константа const double Pi = 3.14159;
Поле только для чтения readonly int id;
Ссылка, допускающая null string? maybe = null;
Объединение с null var y = maybe ?? "default";
Условный доступ при null int? len = text?.Length;
Преобразование типа int n = int.Parse("42"); / Convert.ToDouble(s)
C#
int a = 10, b = 3;
double d = 2.5;
bool ok = a > b && b != 0;
string label = $"a / b = {a / b}, остаток {a % b}";

Console.WriteLine(label);      // a / b = 3, остаток 1
Console.WriteLine(d / 2);      // 1.25
Console.WriteLine(ok);         // True

Управление потоком

Конструкция Синтаксис
If / else if (x > 0) { ... } else { ... }
Оператор switch switch (n) { case 1: ...; break; default: ...; }
Switch-выражение var s = n switch { 1 => "one", _ => "other" };
Цикл while while (i < n) { ... }
Цикл do-while do { ... } while (i < n);
Цикл for for (int i = 0; i < n; i++) { ... }
Цикл foreach foreach (var item in list) { ... }
Break / continue break; выходит из цикла, continue; — следующая итерация
C#
for (int i = 1; i <= 10; i++)
{
    if (i % 2 != 0) continue;   // пропустить нечётные
    if (i > 8) break;           // выйти из цикла
    Console.WriteLine(i);       // 2, 4, 6, 8
}

Методы

Операция Синтаксис
Определить метод int Add(int a, int b) { return a + b; }
С телом-выражением int Add(int a, int b) => a + b;
Без возвращаемого значения void Greet() { ... }
Необязательный параметр int Pow(int b, int e = 2) { ... }
Именованные аргументы Pow(b: 2, e: 3);
Out-параметр bool TryParse(string s, out int n) { ... }
Статический метод static int Square(int x) => x * x;
Лямбда-выражение Func<int, int> f = x => x * 2;
Рекурсия int Fact(int n) => n <= 1 ? 1 : n * Fact(n - 1);
C#
static int Gcd(int a, int b) => b == 0 ? a : Gcd(b, a % b);

Console.WriteLine(Gcd(48, 18));   // 6

Классы и ООП

Операция Синтаксис
Определить класс class Dog { ... }
Автосвойство public string Name { get; set; }
Свойство только для чтения public int Id { get; }
Конструктор public Dog(string name) { Name = name; }
Создать объект var d = new Dog("Rex");
Наследование class Puppy : Dog { ... }
Интерфейс interface IRunnable { void Run(); }
Переопределить метод public override void Speak() { ... }
Record (неизменяемый) record Point(int X, int Y);
C#
class Animal
{
    public string Name { get; set; }
    public Animal(string name) => Name = name;
    public virtual string Speak() => "...";
}

class Cat : Animal
{
    public Cat(string name) : base(name) { }
    public override string Speak() => "Мяу";
}

var cat = new Cat("Барсик");
Console.WriteLine($"{cat.Name}: {cat.Speak()}");

Коллекции

Обобщённые коллекции из System.Collections.Generic.

Тип Применение и пример
List<T> Динамический массив: list.Add(1); list.Count;
Dictionary<K, V> Ключ-значение: dict["a"] = 1; dict.ContainsKey("a");
HashSet<T> Уникальные значения: set.Add(5); set.Contains(5);
Queue<T> FIFO: q.Enqueue(x); q.Dequeue();
Stack<T> LIFO: s.Push(x); s.Pop();
Массив int[] nums = { 1, 2, 3 };
Инициализатор коллекции var l = new List<int> { 1, 2, 3 };
Обойти словарь foreach (var kv in dict) { kv.Key; kv.Value; }
C#
var marks = new Dictionary<string, int>
{
    ["Анна"] = 5,
    ["Иван"] = 4,
};

marks["Пётр"] = 3;

foreach (var pair in marks)
    Console.WriteLine($"{pair.Key}: {pair.Value}");

LINQ

Удобные запросы к коллекциям; из System.Linq.

Операция Синтаксис
Фильтрация nums.Where(n => n > 0)
Проекция / преобразование nums.Select(n => n * 2)
Сортировка nums.OrderBy(n => n) / OrderByDescending(...)
Первое совпадение nums.First(n => n > 5) / FirstOrDefault(...)
Any / all nums.Any(n => n < 0) / nums.All(n => n > 0)
Посчитать совпадения nums.Count(n => n > 0)
Агрегация nums.Sum(), nums.Max(), nums.Average()
Группировка items.GroupBy(i => i.Category)
Материализация .ToList() / .ToArray()
C#
using System.Linq;

var nums = new[] { 5, -2, 9, 0, 7, 3 };

var result = nums
    .Where(n => n > 0)
    .OrderByDescending(n => n)
    .Select(n => n * n)
    .ToList();

Console.WriteLine(string.Join(", ", result));   // 81, 49, 25, 9
Console.WriteLine(nums.Sum());                  // 22

Частые паттерны (свойства, async)

Паттерн Синтаксис
Асинхронный метод async Task<int> GetAsync() { ... }
Ожидание задачи var result = await GetAsync();
Try / catch try { ... } catch (Exception e) { ... }
Finally finally { ... } выполняется всегда
Using (освобождение ресурса) using var file = File.OpenRead(path);
Форматирование строк $"Total: {amount:C}"
Обобщённый класс class Box<T> { public T Value; }
Сопоставление с образцом if (obj is Dog d) { d.Bark(); }

Строки

Операция Пример
Длина s.Length
Верхний / нижний регистр s.ToUpper(), s.ToLower()
Обрезка пробелов s.Trim()
Замена s.Replace("a", "b")
Разбиение s.Split(' ')
Соединение string.Join(", ", parts)
Поиск подстроки s.Contains("abc"), s.IndexOf("a")
Срез s.Substring(1, 3) или s[1..4]
Сравнение без учёта регистра string.Equals(a, b, StringComparison.OrdinalIgnoreCase)

Что дальше