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

Cотрудничество: @energy_c

Реклама на бирже: https://telega.in/channels/csharp_ready/card

РКН: https://clck.ru/3SBaT3
Download Telegram
👩‍💻 Разбираем readonly struct — как запретить изменения без лишних затрат?

Этот тип фиксирует все значения на этапе создания и исключает любые дальнейшие изменения.

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

• Нельзя менять поля;

• Нет скрытых действий;

• Меньше ошибок в коде.


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

➡ C# Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍7❤4
Горячая перезагрузка конфигурации через IOptionsMonitor — мгновенные изменения без рестарта!

Иногда DevOps-ам нужно править лимиты или строки подключения прямо в appsettings.json, а пользователям нельзя прерывать сервис. Подключаем «живую» конфигурацию и реагируем на правки на лету.

Подготавливаем конфиг с reloadOnChange и DI-контейнер:
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", reloadOnChange: true)
.Build();

var services = new ServiceCollection()
.AddSingleton<IConfiguration>(config)
.Configure<MySettings>(config.GetSection("MySettings"))
.AddSingleton<Worker>()
.BuildServiceProvider();

// запускаем
services.GetRequiredService<Worker>();
Console.ReadLine();


Регистрируем класс настроек и ловим изменения:
public record MySettings(int Limit, string Message);

public class Worker
{
public Worker(IOptionsMonitor<MySettings> opts) =>
opts.OnChange(s =>
Console.WriteLine($"↻ Новый лимит: {s.Limit}, msg: {s.Message}")
);
}


🔥 Правьте appsettings.json — консоль сразу выводит новые значения: без перезапуска, без таймеров, полностью нативно.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4👍3
👩‍💻 Проверяем процессы и их пути!

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

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

• Запуск от администратора;

• Программа не падает;

• Пустой путь возможен.


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

➡️ C# Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤4🔥4🤝1
Как получить текст аргумента без nameof и макросов?

В C# 10 появилась аннотация CallerArgumentExpression, которая позволяет получить текст исходного выражения аргумента прямо внутри метода.

Пример: метод Check() автоматически подставит выражение, переданное при вызове:
Check(user?.Name);

выбросит → ArgumentNullException: user?.Name

• Упрощает логи, assert’ы и валидацию без nameof и ручных строк,
• Работает с любыми типами параметров,
• Удобно для написания guard-методов, fluent API и диагностики.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6🔥3
👩‍💻 Environment — всё под контролем!

Работай с окружением так, будто ты пишешь системный софт. Узнавай, где ты, на чём, для кого — и завершай процесс красиво.

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27🤝6❤5👍3
Внедряем DI в консольном приложении — быстро и компактно!

Когда даже маленькая утилита разрастается, хочется легко подменять реализации для тестов и разных сред. Подключаем DI из Microsoft .Extensions.DependencyInjection — без ASP.NET и лишнего кода.

Подключаем пакет, описываем контракт и реализацию, настраиваем контейнер:
using Microsoft.Extensions.DependencyInjection;

interface IGreeter
{
void Greet(string name);
}

class ConsoleGreeter : IGreeter
{
public void Greet(string name) => Console.WriteLine($"👋 Привет, {name}!");
}


Сначала объявляем контракт и его реализацию, а затем подключаем DI-контейнер:
var services = new ServiceCollection()
.AddSingleton<IGreeter, ConsoleGreeter>()
.BuildServiceProvider();


Достаём сервис из контейнера и используем его в основной логике приложения:
var greeter = services.GetRequiredService<IGreeter>();
greeter.Greet("C# Ready");


🔥 Всего пару строк регистрации — и ваше консольное приложение получает гибкость, тестируемость и чистые зависимости.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🔥3
👩‍💻 Окно без пауз сборщика!

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

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

• Запланируй нужный запас;

• Мониторь рост потребления;

• Заверши режим вовремя.


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

➡️ C# Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤6🤝6👍4
Лайфхак для Record Struct!

Знали ли вы, что record struct — это не просто короткий способ описать данные, а отличный инструмент для иммутабельных value-типов, которые не создают лишних объектов в куче?

Он сочетает преимущества структур (располагаются на стеке) и record-типа (автогенерация Equals, GetHashCode, ToString):
public readonly record struct Point(int X, int Y);


Такой тип можно использовать как ключ в словарях, сравнивать по значению и не бояться боковых эффектов:
var p1 = new Point(10, 20);
var p2 = new Point(10, 20);

Console.WriteLine(p1 == p2); // True
Console.WriteLine(p1); // Point { X = 10, Y = 20 }


А если нужно изменить одно поле, не нарушая иммутабельность — используйте with:
var p3 = p1 with { X = 99 };
Console.WriteLine(p3); // Point { X = 99, Y = 20 }


🔥 Главное — помнить, что record struct копируется по значению, так что большие структуры лучше не передавать по значению слишком часто.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤9👍5
🤨 Как упростить проверки и сделать код выразительнее?

В C# появились логические и реляционные паттерны, которые позволяют писать условия естественно и компактно — без цепочек if, && и лишних скобок.

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

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17🔥6👍5