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
Почему var иногда читается лучше, чем явный тип?

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

Например, здесь:
Dictionary<string, List<User>> usersByRole = new Dictionary<string, List<User>>();


код формально понятный, но перегруженный.
Тип уже явно указан в момент создания объекта, поэтому повтор слева только делает запись длиннее.

Гораздо проще читается такой вариант:
var usersByRole = new Dictionary<string, List<User>>();


Здесь внимание уходит не на длинное имя типа, а на сам смысл переменной.
Код выглядит легче, чище и быстрее считывается.

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

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

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍7🔥6
☕️ Нашёл годную статью — экспресс-введение в Avalonia UI, создание кроссплатформенного калькулятора на ․NET.

В этой статье:

• Базовая подготовка: dotnet new + VS Code, установка шаблонов Avalonia
• Разметка интерфейса на Grid и биндинги MVVM через ReactiveUI
• Стилизация: от локальных сеттеров до готовой Material-темы

🟡 Рекомендую прочитать на Habr!


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3🔥3
👩‍💻 Генерация случайностей на любой вкус — от int до байтов и double!

Random в C# — это гибкий инструмент для генерации случайных данных: от чисел до байтов. Особенно важен при работе с многопоточностью.

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23🤝104👍2
📂 Напоминалка для работы с OOP Design Patterns!

Например, Factory помогает делегировать создание объектов, а Observer — удобно реализовать систему подписок и событий.

На картинке — 9 самых нужных паттернов, которые часто встречаются в реальных проектах и архитектуре.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥139👍7🤝1
Почему Count читается лучше, чем Count()?

Когда у нас уже есть конкретная коллекция, например List<T> или массив, количество элементов можно получить напрямую через свойство. В таком случае запись через Count() выглядит чуть тяжелее, чем нужно.

Например, здесь:
if (users.Count() > 0)
{
SendPromo(users);
}


формально всё работает, но при чтении возникает лишний вопрос: зачем здесь LINQ-метод, если коллекция и так уже известна?

Гораздо проще воспринимается такой вариант:
if (users.Count > 0)
{
SendPromo(users);
}


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

Это особенно актуально в местах, где важна простота чтения: в if, валидации, guard-условиях и любой повседневной бизнес-логике.

Важно только помнить: такой подход подходит именно тогда, когда тип коллекции уже известен.

Если перед вами IEnumerable<T>, то свойства Count у него может не быть, и это уже другая ситуация.

🔥Маленькая замена, а код выглядит чище и естественнее уже с первого взгляда.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥5🤝3
😎 Иногда вложенные циклы в 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