C# Ready | Unity
10.1K subscribers
1.19K photos
62 videos
547 links
Авторский канал по разработке на C# и Unity.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3SBaT3

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
❤️ Крутая статья — быстрый вход в Roslyn: как своими руками собрать простой анализатор!

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

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3🔥3
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 | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍7🔥4
👍138🔥7
Как запретить наследование, но оставить удобный 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 | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍43
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ Scott Hanselman — один из самых известных .NET-блогов про разработку «из практики»

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

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3🔥3
👩‍💻 CancellationToken без лишней магии!

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

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥157👍5🤝2
📂 Шпаргалка по System Design!

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

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥5👍4
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 | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍159🔥7
Почему 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 | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥54
👩‍💻 Быстро собирать и менять строки — вот что умеет StringBuilder.

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

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥18🤝153
📂 Напоминалка по HTTP-статусам!

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

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

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

C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍109
👩‍💻 Парсер аргументов командной строки — быстро и по-человечески!

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

В этой задаче узнаешь:
Как разбирать флаги -v/-h без путаницы;

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

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


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

➡️ C# Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍65👎3🤝3