csharp_ready | Unsorted

Telegram-канал csharp_ready - C# Ready | Unity

9818

Авторский канал по разработке на C# и Unity. Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it РКН: https://clck.ru/3SBaT3 Реклама на бирже: https://telega.in/c/csharp_ready

Subscribe to a channel

C# Ready | Unity

📂 Шпаргалка по API-протоколам!

Разные способы общения сервисов подходят под разные задачи: где-то нужны обычные запросы, где-то события, стриминг или real-time. Есть варианты попроще для типовых интеграций и более строгие/быстрые — для микросервисов, высокой нагрузки и IoT.

На картинке — краткая карта API-технологий и когда что выбирать. Сохрани, пригодится.

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

Почему ??= читается лучше, чем if (x == null)?

Самая частая “мелкая боль” в C# — ленивые дефолты: “если ещё не задано — создай”. Из-за этого в коде растут одинаковые проверки null, которые не добавляют смысла и мешают читать логику.

Оператор ??= делает ровно то же самое, но прямо выражает намерение:

user ??= new User();


Это эквивалентно:
if (user == null)
user = new User();


Особенно полезно, когда значение может прийти из разных мест (DI, конфиг, кеш), и ты просто хочешь гарантировать дефолт без лишнего ветвления.

🔥??= — дешёвый способ убрать шум, снизить шанс “забыл присвоить” и сделать код читаемым

➡️ C# Ready | #совет

Читать полностью…

C# Ready | Unity

CallerArgumentExpression: показываем точное выражение в ошибке без ручных строк!

Часто в коде есть проверки аргументов: null, пустая строка, отрицательное значение. Обычно хочется, чтобы ошибка сразу говорила, какое именно выражение провалилось, но это быстро превращается в ручные строки и копипасту.

Раньше приходилось писать сообщения руками, чтобы понять причину падения:

static void Ensure(bool condition, string message)
{
if (!condition)
throw new ArgumentException(message);
}


Здесь метод универсальный, но он ничего не знает про то, какое условие ты проверяешь, поэтому информацию приходится передавать строкой.

И вот как это выглядит на реальном вызове:
var user = "Анна";
var age = -1;

Ensure(!string.IsNullOrWhiteSpace(user), $"Некорректный user: '{user}'");
Ensure(age > 0, $"Некорректный age: {age}");


Проблема в том, что это шумно: строки надо поддерживать, легко забыть обновить при рефакторинге, а сложные условия превращаются в “конструктор сообщений”.

В C# 10 появился CallerArgumentExpression — он умеет получать исходный текст выражения, которое передали в метод:
using System.Runtime.CompilerServices;

static void Ensure(bool condition, string? message = null,
[CallerArgumentExpression("condition")] string? expr = null)
{
if (!condition)
throw new ArgumentException(message ?? $"Проверка не прошла: {expr}");
}


А вызов теперь можно сделать коротким, без ручных строк:
var user = "Анна";
var age = -1;

Ensure(!string.IsNullOrWhiteSpace(user));
Ensure(age > 0);


Если условие провалится, сообщение получится информативным автоматически, например “Проверка не прошла: age > 0”.

🔥 Проверки становятся короче, а сообщения об ошибках — намного полезнее без копипасты.

➡️ C# Ready | #практика

Читать полностью…

C# Ready | Unity

Как писать SQL / JSON с интерполяцией без +, \n и экранирования?

Когда в коде появляются большие SQL или JSON, обычные строки быстро превращаются в кашу: конкатенации, \n, кавычки, сложно читать и ещё сложнее править.

В C# 11 появились raw-строки ("""), которые позволяют писать многострочный текст “как есть”:

var sql = """
SELECT * FROM Users
""";


Но что делать, если в тексте нужны переменные?

Для этого используются raw-строки с интерполяцией — $$""" и {{ }}:
var sql = $$"""
FROM {{table}}
WHERE Name = '{{name}}'
""";


Количество $ определяет, сколько { нужно для вставки значения — это позволяет без боли писать JSON, SQL и шаблоны с фигурными скобками внутри.

🔥 raw-строки с интерполяцией — лучший способ хранить большие тексты в коде.

➡️ C# Ready | #совет

Читать полностью…

C# Ready | Unity

👩‍💻 Рассмотрим Task — ключевая абстракция для асинхронного программирования!

Он помогает запускать параллельные операции, строить цепочки задач и управлять временем их выполнения без блокировки потоков.

➡️ C# Ready | #шпора

Читать полностью…

C# Ready | Unity

🤫 Шпаргалка: как работает HTTPS!

На картинке — простая схема, которая показывает, как браузер и сервер создают безопасное соединение: сначала проверяют сертификат через CA, затем обмениваются ключами и выбирают шифры, а после поднимают зашифрованный туннель для передачи данных с сеансовым ключом.

Сохрани, чтобы быстро освежить в голове TLS-рукопожатие и легко объяснить HTTPS на собесе или друзьям!

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

☕️ Guru99 C# — это крутой онлайн-ресурс для самостоятельного изучения языка!

На нём собраны структурированные уроки, которые охватывают как базовые, так и продвинутые темы — от переменных и циклов до ООП, работы с файлами и созданием оконных приложений.

📌 Оставляю ссылочку: guru99.com

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

📂 Напоминалка по HTTP-статусам!

Например, код 200 означает, что всё прошло успешно, а 404 сообщает, что страница не найдена.
Очень полезно держать под рукой, когда работаешь с API или отлаживаешь backend.

На картинке показаны самые часто используемые статусы от 100 до 599.

Сохрани, чтобы не забыть!

➡ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

Почему DateTime.Now иногда ломает сроки действия?

Типичная ошибка — сохранять локальное время сервера и потом сравнивать его с UTC. Выглядит невинно:

var expiresAt = DateTime.Now.AddHours(1);
if (DateTime.UtcNow > expiresAt) { ... }


Но Now зависит от таймзоны и DST: окружение поменялось — и сравнения начинают “плавать”. Надёжнее хранить момент времени в UTC, лучше через DateTimeOffset:
var expiresAtUtc = DateTimeOffset.UtcNow.AddHours(1);
if (DateTimeOffset.UtcNow > expiresAtUtc) { ... }


А локальную дату оставь для UI — конвертируй в таймзону пользователя:
var expiresForUser = TimeZoneInfo.ConvertTime(expiresAtUtc, userTz);


Итог: UTC для хранения и сравнения, локаль — только для отображения.

➡️ C# Ready | #совет

Читать полностью…

C# Ready | Unity

📂 Шпаргалка по System Design!

На картинке — компактная памятка о том, как мыслить в системном дизайне через три главные цели: держать систему доступной 24/7, переваривать большой поток запросов и безболезненно расти по нагрузке и функциональности.

Сохрани, чтобы быстро освежать логику выбора решений и связывать требования бизнеса с метриками и архитектурой перед практикой и собеседованиями.

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

☕️ Scott Hanselman — один из самых известных .NET-блогов про разработку «из практики»

Личный блог инженера из Microsoft, где регулярно выходят разборы .NET/C#, инструменты для разработчиков, советы по продуктивности, заметки про веб/облако и реальный опыт “как это работает в жизни”, а не в вакууме.

📌 Оставляю ссылочку: hanselman.com

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

List.ForEach для компактных действий над списком!

Сейчас научимся быстро выполнять действия над элементами списка без шаблонного цикла foreach — с помощью встроенного метода List.ForEach.

Для начала подключим стандартные библиотеки — всё уже включено:

using System;
using System.Collections.Generic;


Создадим простой список чисел:
List<int> numbers = new() { 1, 2, 3, 4, 5 };


Вот как это обычно делается с использованием стандартного цикла:
foreach (var n in numbers)
Console.WriteLine(n);


Теперь то же самое, но с использованием ForEach — короче и нагляднее:
numbers.ForEach(Console.WriteLine);


Если нужно выполнить более сложное действие — например, вывести квадраты чисел — можно передать лямбда-выражение:
numbers.ForEach(n => Console.WriteLine(n * n));


🔥 Метод ForEach избавляет от шаблонного кода, делает перебор наглядным и экономит место

➡️ C# Ready | #практика

Читать полностью…

C# Ready | Unity

FormattableString: перехватываем интерполяцию строки до того, как она станет string!

Иногда интерполированную строку хочется не просто вывести, а обработать “умно”: например, отправить в лог с параметрами, локализовать, или сохранить шаблон отдельно от значений.

Обычно интерполяция сразу превращается в готовую строку, и ты теряешь структуру:

var user = "Анна";
var age = 28;

string text = $"Пользователь {user}, возраст {age}";
Console.WriteLine(text);


Здесь в переменной уже обычный string, а исходные значения и формат “слились” в одну строку.

Если принять FormattableString, можно получить и шаблон, и аргументы отдельно:
FormattableString msg = $"Пользователь {user}, возраст {age}";

Console.WriteLine(msg.Format);
Console.WriteLine(string.Join(", ", msg.GetArguments()));


msg.Format вернёт шаблон вида "Пользователь {0}, возраст {1}", а GetArguments() — массив значений, которые подставлялись в интерполяцию.

🔥 Итог: можно логировать и локализовать интерполированные строки правильно — сохраняя шаблон и параметры, а не только готовый текст.

➡ C# Ready | #практика

Читать полностью…

C# Ready | Unity

👩‍💻 Логгер в файл, который делает проект “взрослее”!

Пара методов — и твоя программа начинает вести аккуратный журнал событий: что произошло, когда произошло и насколько это важно.

В этой задаче узнаешь:

• Как писать логи в файл одной строкой через File.AppendAllText;

• Зачем нужны уровни INFO/WARN/ERROR и как их удобно оформить через enum;

• Как сделать обёртки, чтобы логирование выглядело красиво и читалось мгновенно.


Один раз собрал — и дальше просто вставляешь в любой проект, чтобы быстрее находить ошибки и понимать, что происходит внутри.

➡ C# Ready | #задача

Читать полностью…

C# Ready | Unity

Как создавать строки без лишних аллокаций?

Самый частый антипаттерн — склеивать строки через +. Каждая конкатенация создаёт новую строку, и при активном логировании или форматировании это начинает бить по памяти и GC.

Для обычного кода достаточно интерполяции — она читается лучше и компилятор оптимизирует её:

var text = $"Имя: {name}, возраст: {age}";


Но в горячих местах (логи, сериализация, парсинг) есть string.Create, который позволяет сразу записать результат в выделенный буфер:
string.Create(length, state, (span, data) => { ... });


🔥 В 90% случаев используй интерполяцию ради читаемости, а string.Create оставь для действительно нагруженных участков — меньше аллокаций, меньше давления на GC, больше контроля над созданием строки.

➡️ C# Ready | #практика

Читать полностью…

C# Ready | Unity

👩‍💻 Преобразования типов без лишней магии!

В этой шпаргалке — как приводить значения к нужному типу без сюрпризов: где ловятся ошибки формата и переполнения, почему числа и даты зависят от культуры, как безопасно работать с null, и чем “пусто из базы” отличается от обычного null.

➡️ C# Ready | #шпора

Читать полностью…

C# Ready | Unity

❓ А у вас в проекте “unsafe” когда-нибудь появлялся незаметно?

В C# обсуждают идею caller-unsafe: опасный API помечается так, что вызвать его можно только из кода в unsafe.

Почему это важно: сейчас метод может быть объявлен unsafe, но это не всегда означает, что вызывающий код тоже обязан быть unsafe. Из-за этого небезопасные места иногда прячутся “между строк” и хуже ловятся на ревью.

Если фичу примут, контракт станет честнее: хочешь вызвать такой метод — явно отмечай место вызова как unsafe (осознанно).

Обсуждение:
dotnet/csharplang

➡️ C# Ready | #новость

Читать полностью…

C# Ready | Unity

❤️ Refactoring.Guru — это образовательный сайт о рефакторинге, паттернах проектирования и принципах SOLID!

На нём вы найдёте каталог code smells (запахов кода) и техник рефакторинга, а также разбор 22 классических паттернов с понятными объяснениями и примерами. Плюс — книги и материалы для системного изучения темы.

📌 Оставляю ссылочку: refactoring.guru

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

💅 Tutorials Teacher — сайт для начинающих в C#

Там собрано множество обучающих материалов, начиная с простого уровня, вы сможете обучаться, а также проходить тесты. Подмечу что в нужных местах присутствуют картинки, что помогает усвоить материал лучше.

📌 Ссылочка: tutorialsteacher.com

➡️ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

Если бы рост в IT был лестницей, большинство было бы Senior.

Но на собеседованиях выясняется, что опыт, стаж и “я уже Middle” почти ничего не решают.

Илья Шишков 11 лет работал в Яндексе и провёл 250+ интервью и видел это постоянно. В канале @imhired разбирает, по каким признакам кандидатов относят к Junior, Middle и Senior - и почему многие готовятся совсем не к этому.

Начни с первого файла👇
(руководство по решению любой алгори...)

Читать полностью…

C# Ready | Unity

Читаем большой файл построчно — когда лог огромный, а память не резиновая!

Иногда нужно обработать большой лог или CSV на десятки/сотни мегабайт. Если читать его целиком через ReadAllLines(), файл сначала полностью грузится в память — это лишние аллокации и давление на GC.

Для таких случаев в C# есть File.ReadLines() — он читает файл лениво, отдавая строки по мере чтения.

Подключим нужные пространства имён:

using System;
using System.IO;


Зададим путь к файлу:
string path = @"C:\Logs\app.log";


Пройдёмся по файлу построчно и посчитаем ошибки:
int errors = 0;

foreach (var line in File.ReadLines(path))
{
if (line.Contains("ERROR"))
errors++;
}

Console.WriteLine($"Найдено ошибок: {errors}");


🔥 ReadLines() идеально подходит для больших файлов: не загружает всё в память, обрабатывает “на лету” и помогает избежать лишних аллокаций.

➡️ C# Ready | #практика

Читать полностью…

C# Ready | Unity

👩‍💻 Парсер аргументов командной строки — быстро и по-человечески!

args[] легко превращается в понятные настройки: флаги включают режимы, --file принимает путь, а всё лишнее аккуратно ловится как ошибка.

В этой задаче узнаешь:

• Как разбирать флаги -v/-h без путаницы;

• Как поддержать --file=... и --file ... одним правилом;

• Зачем нужен --, чтобы отделять опции от аргументов.


Такой каркас можно спокойно расширять: добавлять --out, --mode, команды и нормальные сообщения об ошибках.

➡️ C# Ready | #задача

Читать полностью…

C# Ready | Unity

👩‍💻 Быстро собирать и менять строки — вот что умеет StringBuilder.

Он позволяет вставлять, удалять, заменять и дополнять текст без лишнего расхода памяти. Если в коде много строковых операций — обязательно держи под рукой этот инструмент.

➡️ C# Ready | #шпора

Читать полностью…

C# Ready | Unity

Raw string literals в C# 11: многострочные строки без экранирования и боли!

Когда нужно вставить JSON, SQL или Regex в код, обычные строки быстро превращаются в ад: везде обратные слеши, кавычки, переносы строк и постоянные ошибки в экранировании.

Раньше приходилось экранировать кавычки и руками добавлять переносы:

string json = "{\n" +
" \"user\": \"Anna\",\n" +
" \"age\": 28,\n" +
" \"city\": \"Helsinki\"\n" +
"}";
Console.WriteLine(json);


Такой код трудно читать, а любая правка JSON превращается в мини-квест.

В C# 11 появились raw string literals — строки в тройных кавычках, где почти ничего не нужно экранировать:
string json = """
{
"user": "Anna",
"age": 28,
"city": "Helsinki"
}
""";

Console.WriteLine(json);


Переносы строк сохраняются как есть, кавычки внутри не нужно экранировать, и текст выглядит ровно так, как он должен выглядеть.

🔥 Итог: идеально для JSON/SQL/Regex — меньше мусора в коде, больше читабельности и меньше ошибок при редактировании.

➡️ C# Ready | #практика

Читать полностью…

C# Ready | Unity

👩‍💻 CancellationToken без лишней магии!

В этой шпаргалке — практический подход к отмене в async-коде: как задавать дедлайны, объединять причины отмены, корректно останавливать вычисления и не забывать прокидывать токен до реальных операций, чтобы отмена работала предсказуемо.

➡️ C# Ready | #шпора

Читать полностью…

C# Ready | Unity

Как запретить наследование, но оставить удобный with?

Иногда хочется сделать тип “закрытым” для наследования (чтобы никто не ломал инварианты), но при этом сохранить кайф от record: удобное сравнение по значениям и копирование через with.

Для этого есть sealed record — запись, которую нельзя унаследовать, но она всё так же поддерживает with:

public sealed record UserDto(string Name, int Age);
var u2 = u1 with { Age = 29 };


with создаёт новый объект, копируя все поля/свойства, и меняет только указанные — идеально для неизменяемых моделей.

А если нужно чуть больше гибкости (например, добавить необязательное поле), можно использовать record с init-свойствами:
public sealed record UserDtoV2(string Name, int Age)
{
public string? Email { get; init; }
}


🔥 Когда хочешь “immutable + удобно копировать”, но не хочешь наследования и сюрпризов от потомков — делай sealed record.

➡️ C# Ready | #совет

Читать полностью…

C# Ready | Unity

❤️ Крутая статья — быстрый вход в Roslyn: как своими руками собрать простой анализатор!

В этой статье:
• Поймёшь, как устроены SyntaxTree и SemanticModel без перегруза
• Увидишь, как обходить узлы дерева и находить нужные конструкции
• Разберёшь минимальный скелет анализатора, диагностики и запуск на проекте

🔊 Продолжай читать на Habr!


➡️ C# Ready | #статья

Читать полностью…

C# Ready | Unity

CSharpier — это инструмент для автоматического форматирования кода на C# по строгим и предсказуемым правилам, предлагая единый стиль форматирования для улучшения читаемости и поддержания консистентности кода.

Оставляю ссылочку: Github 📱


➡️ C# Ready | #репозиторий

Читать полностью…

C# Ready | Unity

😎 Шпаргалка по основам C#!

На картинке — компактная памятка с самым нужным по C#: каркас программы, основные операторы и выражения, функции и параметры, структуры и примеры работы с данными. Отдельно показан Console I/O: ввод/вывод, escape-последовательности и быстрые примеры преобразований типов.

Сохрани, чтобы быстро освежать синтаксис и не отвлекаться на поиск мелочей во время практики, задач и подготовки к собеседованиям.

➡ C# Ready | #ресурс

Читать полностью…

C# Ready | Unity

📂 Шпаргалка по IP-адресам!

Например, 192.168.x.x — для домашней сети, а 10.x.x.x — для крупных корпоративных систем. CIDR (/24, /16, /8) — помогает точно задать размер подсети и количество хостов.

На картинке — всё, что нужно знать про IP: диапазоны, маски, специальные адреса, публичные DNS и основы IPv6.

Сохрани, чтобы не забыть!

➡️ C# Ready | #ресурс

Читать полностью…
Subscribe to a channel