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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/csharp_ready
Download Telegram
Как перестать писать if (str != null && str.Trim() != "") ??

Во вводе пользователя и данных из внешних систем мы постоянно боимся null и пустых строк — в итоге условия разрастаются:
string name;
if (user.InputName != null && user.InputName.Trim() != "")
{
name = user.InputName.Trim();
}
else
{
name = "Гость";
}


С string.IsNullOrWhiteSpace то же самое записывается гораздо короче и понятнее:
var name = string.IsNullOrWhiteSpace(user.InputName)
? "Гость"
: user.InputName.Trim();


string.IsNullOrWhiteSpace сразу проверяет три вещи: строка не null, не пустая и не состоит из одних пробелов.

🔥 Вместо громоздких ручных проверок используем один метод — меньше шума в условиях, меньше шансов забыть про крайний случай, а код читается как простое правило: «если имя не задано — подставь "Гость"».

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
21🔥13👍9😁3
🔥13👍61
Перестаём плодить new HttpClient() с IHttpClientFactory!

Частая ошибка: в каждом методе делать new HttpClient(). В итоге — утечки сокетов, странные таймауты и боль в проде. В .NET есть нормальный способ — IHttpClientFactory.

Сначала регистрируем фабрику и настраиваем клиент в DI:
using System;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.AddHttpClient("github", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.UserAgent.ParseAdd("CSharpReadySample");
});

var provider = services.BuildServiceProvider();


Достаём IHttpClientFactory и берём настроенный клиент по имени:
var factory = provider.GetRequiredService<IHttpClientFactory>();

using var client = factory.CreateClient("github");

var response = await client.GetAsync("repos/dotnet/runtime");
var content = await response.Content.ReadAsStringAsync();

Console.WriteLine(content[..200] + "...");


🔥 Главное — вместо десятков new HttpClient() используйте один IHttpClientFactory: настроили клиент в одном месте, берёте его из DI где нужно — без утечек и с предсказуемым поведением в проде.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍85👎1😁1
🧐 Напоминалка по netcat!

На картинке — компактная шпаргалка по nc: от сканирования портов до туннелей, чата и копирования дисков прямо из терминала.

Сохрани, чтобы под рукой был швейцарский нож сетевика!

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍108🔥7
👩‍💻 IEnumerable vs IQueryable без путаницы!

В этой шпаргалке разбираемся, чем отличается работа LINQ по уже загруженным коллекциям от “живых” запросов к базе: где на самом деле исполняется код, как влияет отложенное выполнение и материализация

➡️ C# Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤝13🔥81
👍 Разбор C# async/await — понятное объяснение асинхронности без чёрной магии!

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

• Когда использовать асинхронность: IO-bound против CPU-bound операций
• Как async/await компилятором превращается в машину состояний
• Примеры Task, ValueTask, WhenAny и обработка исключений без магии

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


➡️ C# Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍7🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ ByteHide Blog — C# Clean Code & Tips!

Блог про C# и .NET с упором на чистый и поддерживаемый код: практичные гайды, подборки сниппетов, разбор современных фич (C# 12, .NET 10, атрибуты, паттерны), плюс статьи для прокачки от уровня новичка до мидла.

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥5👍4
🔥15👍85
Как упростить работу с индексами и подстроками?

Классический подход — вечные Substring и ручные вычисления длины. В итоге получаем выражения, которые трудно читать и легко сломать:
var lastChar = input[input.Length - 1];
var withoutLast = input.Substring(0, input.Length - 1);


Чем больше таких мест, тем больше “магических чисел” и арифметики над Length, особенно при работе с расширениями файлов, префиксами и хвостами строк.

С индексами (^) и диапазонами (..) в C# можно писать это намного компактнее и ближе к тому, как мы думаем о строке:
var lastChar = input[^1];    // последний символ
var withoutLast = input[..^1]; // всё, кроме последнего


Здесь ^1 — “первый элемент с конца”, [..^1] — “с начала до элемента перед последним”. Для хвостов и расширений тоже получается читаемое правило: [^3..] — последние три символа, [..^4] — всё, кроме последних четырёх.

🔥 Итог: меньше Substring, меньше ручных Length - 1, код читается как работа с отрезками строки, а не как арифметика с индексами.

➡️ C# Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥8👍6
Прогресс-бар в консоли для долгих операций — наглядный прогресс без UI!

Когда операция выполняется несколько секунд (или минут), пустая консоль выглядит как зависшая. Проще сразу показывать прогресс — например, в виде текстового прогресс-бара.

Нам хватит стандартных пространств имён:
using System;
using System.Threading;


Сделаем простой пример: у нас есть «долгая» операция из 100 шагов. В цикле будем имитировать работу через Thread.Sleep и обновлять строку прогресса:
int total = 100;

for (int i = 0; i <= total; i++)
{
DrawProgressBar(i, total);
Thread.Sleep(50); // имитация долгой работы
}

Console.WriteLine();
Console.WriteLine("Готово!");


Вся магия в методе DrawProgressBar: он считает процент, строит строку вида [#####-----] 50% и перерисовывает одну и ту же строку в консоли:
static void DrawProgressBar(int current, int total)
{
int width = 30; // ширина прогресс-бара в символах

double progress = (double)current / total;
int filled = (int)(progress * width);

string bar = new string('#', filled) + new string('-', width - filled);

Console.Write($"\r[{bar}] {progress:P0}");
}


Ключевой момент — \r в начале строки:
он возвращает курсор в начало текущей строки, поэтому новый вывод перезаписывает старую строку прогресса, а не переносит консоль вниз.

В итоге во время работы программы ты увидишь динамически меняющуюся строку:
[###############---------------] 50%


и по завершении — Готово!.

🔥 Главное — вынести отрисовку прогресса в отдельный метод и обновлять одну строку через \r, тогда консоль не превратится в простыню из сотен сообщений.

➡️ C# Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍169🔥5😁2
👩‍💻 Сколько времени прошло на самом деле?

Переведём сухие числа разницы во времени в живые фразы, чтобы «через час» и «три дня назад» звучали естественно и не требовали пересчёта.

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

Как почувствовать разницу между датами, а не числами;

Где естественно сказать «назад», а где «через»;

Почему короткая фраза о времени понятнее таймера.


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

➡️ C# Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍85🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ CodeAbbey — тренажёр алгоритмического мышления!

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

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

➡️ C# Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥117👍4