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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
😎 Иногда вложенные циклы в C# превращаются в маленький лабиринт!

Нашёл свежий разбор про labeled break и continue в C# 15 — фичу, которая может сделать выход из вложенных циклов чуть понятнее, но при неправильном использовании легко ухудшит читаемость.

В статье:

• как обычно выходят из нескольких вложенных циклов
• что предлагают labeled break и continue
• почему новая возможность не отменяет нормальный рефакторинг кода

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2🔥2
Отслеживаем изменения в папке через FileSystemWatcher — мгновенный отклик без опроса!

Иногда нужно сразу реагировать, когда в каталоге появляется новый файл отчёта или изменяется конфигурация. Вместо бесконечных таймеров используем встроенный наблюдатель файловой системы.

Сначала задаём путь и настраиваем watcher: реагируем на создание и изменение только .txt-файлов, подписываемся на события Created и Changed:
using System.IO;

string path = @"C:\Watched";
using var watcher = new FileSystemWatcher(path, "*.txt")
{
NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
IncludeSubdirectories = false,
// или true — если нужны подпапки
EnableRaisingEvents = true
// запускаем слежение
};

watcher.Created += OnChanged;
watcher.Changed += OnChanged;


Обработчик получает данные об изменении и выводит краткую информацию:
static void OnChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {e.ChangeType}: {e.FullPath}");
}


Чтобы консольное приложение не завершилось раньше времени, просто ждём клавишу:
Console.WriteLine($"👀 Слежение за {path} запущено. Нажмите Enter для выхода…");
Console.ReadLine();


🔥 FileSystemWatcher избавляет от циклов опроса: оперативно, без лишних ресурсов и под любые типы файлов.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥125👍5😁2
Получаем имя переменной с nameof безопасно!

Иногда нужно передать имя переменной, свойства или метода в виде строки.

Например, можно написать так:
string userName = "Анна";

Console.WriteLine("userName");


Такой код работает, но строка "userName" никак не связана с самой переменной.
Если потом переименовать переменную, строка не изменится автоматически.

В C# для этого есть оператор nameof:
string userName = "Анна";

Console.WriteLine(nameof(userName));


nameof возвращает имя переменной, свойства, класса или метода в виде строки.

Вот что получится при запуске:
userName


Это удобно, например, при проверке аргументов:
void PrintName(string name)
{
if (name == null)
throw new ArgumentNullException(nameof(name));

Console.WriteLine(name);
}


Теперь при переименовании параметра name IDE обновит и использование внутри nameof.

🔥 nameof помогает избежать ошибок в строках и делает код безопаснее при рефакторинге

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍7🔥5😁1
📝 Напоминалка по REST API!

Например, GET используют для получения данных, POST — для создания, PUT/PATCH — для обновления, а DELETE — для удаления ресурса.

На шпаргалке — принципы REST, HTTP-методы, версионирование, пагинация, фильтрация и best practices для API.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
17🔥10👍5
👩‍💻 Убираем хрупкие строки с помощью nameof!

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

Что важно знать:

nameof возвращает имя элемента в виде строки

При переименовании IDE обновит ссылку, а не оставит старый текст

Особенно полезен в логах, ошибках, валидации и отладке


Маленькая фича, которая убирает “магические строки” и делает код спокойнее при рефакторинге.

➡️ C# Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15🤝63
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ DotNetCurry — отличный источник знаний для .NET-разработчиков!

Он собрал в себе подробные статьи, пошаговые руководства и примеры кода по C#, ASP․NET, Blazor, Entity Framework и другим технологиям экосистемы Microsoft.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6🔥6
📂 Напоминалка по UML Class Diagrams!

Например, Association показывает связь между классами, Inheritance — наследование, а Composition — ситуацию, когда один объект является частью другого.

На картинке — основные элементы UML-диаграмм классов: классы, методы, атрибуты, интерфейсы и типы связей.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥3
Создаём копию объекта с изменёнными данными!

Иногда нужно взять существующий объект и изменить в нём только одно-два значения.

Например, у нас есть record с данными пользователя:
record User(string Name, int Age);


Создадим пользователя:
User user = new User("Анна", 25);

Console.WriteLine(user);


Вот что получится:
User { Name = Анна, Age = 25 }


Теперь допустим, что возраст изменился.
Можно создать новый объект вручную:
User updatedUser = new User(user.Name, 26);

Console.WriteLine(updatedUser);


Но если свойств много, такой код становится неудобным.

В C# для record можно использовать выражение with:
User updatedUser = user with { Age = 26 };

Console.WriteLine(updatedUser);


with создаёт копию объекта и меняет только указанные свойства.
Исходный объект при этом остаётся прежним.

Вот что получится при запуске:
User { Name = Анна, Age = 26 }


🔥 with удобно использовать, когда нужно аккуратно обновлять immutable-объекты без ручного копирования всех данных

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ Free Programming Books — огромная коллекция бесплатных книг по программированию!

В этом репозитории собраны десятки книг по разным языкам и направлениям, таким как С# и многое другое. Всё разложено по категориям, поэтому можно быстро найти нужную тему. Здесь есть как базовые учебники по синтаксису и указателям, так и более серьёзные материалы по памяти, низкоуровневой работе и системному программированию.

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


➡️ C# Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥137👍6
👩‍💻 Познакомимся с методами Convert — надёжным инструментом для приведения данных нужному типу!

С их помощью можно легко преобразовывать строки и числа в нужные типы, такие как int, double, bool, а также выполнять универсальное преобразование с помощью ChangeType и работать с Base64 для сериализации и передачи данных.

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🤝53🔥3
😎 Полезный разбор типичных ошибок в C#-проектах: перегруженные классы, смешение слоёв и слабая декомпозиция!

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


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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥3
Почему TryParse() лучше, чем Parse() внутри try/catch?

Когда мы работаем с пользовательским вводом, строкой из файла, query-параметром или данными из внешней системы, невалидное значение — это не что-то неожиданное. Это обычный сценарий, который нужно аккуратно обработать.

Если использовать Parse() и ловить ошибку через try/catch, код выглядит так, будто произошла настоящая авария:
try
{
var age = int.Parse(input);
SaveAge(age);
}
catch
{
ShowError();
}


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

Гораздо понятнее выглядит такой вариант:
if (int.TryParse(input, out var age))
{
SaveAge(age);
}
else
{
ShowError();
}


TryParse() сразу показывает намерение:
мы пробуем преобразовать значение и заранее готовы к тому, что оно может быть невалидным.

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

Особенно полезно это при работе с формами, API-запросами, настройками, файлами и любыми данными, которые приходят извне.

🔥 Если ошибка ожидаема — лучше обработать её явно, а не прятать обычную проверку в try/catch.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍5🤝4👎1
🧐 Разбираем типичные варианты архитектурных ошибок!

Нашёл полезный разбор типичных ошибок в C#-проектах: перегруженные классы, смешение слоёв и слабая декомпозиция.

В статье:

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

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84👍3