Когда в коде появляются пустые ссылки, маленький знак вопроса способен спасти программу от падения и превратить проверки в понятные выражения.
В этом гайде:
• Покажем, как аккуратно обращаться с возможными пустыми значениями;
• Разберём приёмы, которые заменяют громоздкие проверки в коде;
• Поможем сделать поведение программы стабильным даже при ошибках ввода.
Один небольшой оператор вокруг значения часто заменяет несколько
if и спасает от неожиданных падений.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥14❤8🤝4
Передаём переменные по ссылке с помощью ref!
Сейчас научимся передавать переменные в методы по ссылке, а не по значению. Это особенно полезно, когда нужно изменить переменную внутри метода и сохранить изменения снаружи.
Подключим нужные библиотеки — всё уже есть в стандартной библиотеке:
Допустим, у нас есть метод, который увеличивает значение числа:
Создадим переменную и передадим её в метод по ссылке:
🔥 Без
➡️ C# Ready | #практика
Сейчас научимся передавать переменные в методы по ссылке, а не по значению. Это особенно полезно, когда нужно изменить переменную внутри метода и сохранить изменения снаружи.
Подключим нужные библиотеки — всё уже есть в стандартной библиотеке:
using System;
Допустим, у нас есть метод, который увеличивает значение числа:
void Increment(ref int number)
{
number++;
}
Создадим переменную и передадим её в метод по ссылке:
int value = 5;
Increment(ref value);
Console.WriteLine(value);
ref переменная осталась бы равной 5 — метод работал бы с копией. А с ним мы передаём реальную переменную, и её значение меняется внутри метода.Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤10🔥7😁1
В этой статье:
• Разбираются первичные конструкторы и влияние на архитектуру классов• Показываются выражения коллекций и упрощение работы со списками• Объясняются новые возможности алиасов типов и параметры по умолчанию🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤7👍4😁1
Как перестать писать
Во вводе пользователя и данных из внешних систем мы постоянно боимся
С
🔥 Вместо громоздких ручных проверок используем один метод — меньше шума в условиях, меньше шансов забыть про крайний случай, а код читается как простое правило: «если имя не задано — подставь "Гость"».
➡️ C# Ready | #совет
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, не пустая и не состоит из одних пробелов.Please open Telegram to view this post
VIEW IN TELEGRAM
❤21🔥13👍9😁3
Перестаём плодить new HttpClient() с IHttpClientFactory!
Частая ошибка: в каждом методе делать
Сначала регистрируем фабрику и настраиваем клиент в
Достаём
🔥 Главное — вместо десятков
➡️ C# Ready | #практика
Частая ошибка: в каждом методе делать
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 где нужно — без утечек и с предсказуемым поведением в проде.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8❤5👎1😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤝13🔥8❤1
В этой статье:
• Когда использовать асинхронность: IO-bound против CPU-bound операций• Как async/await компилятором превращается в машину состояний• Примеры Task, ValueTask, WhenAny и обработка исключений без магии🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍7🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Блог про C# и .NET с упором на чистый и поддерживаемый код: практичные гайды, подборки сниппетов, разбор современных фич (C# 12, .NET 10, атрибуты, паттерны), плюс статьи для прокачки от уровня новичка до мидла.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5👍4
Как упростить работу с индексами и подстроками?
Классический подход — вечные
Чем больше таких мест, тем больше “магических чисел” и арифметики над
С индексами (
Здесь
🔥 Итог: меньше
➡️ C# Ready | #совет
Классический подход — вечные
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, код читается как работа с отрезками строки, а не как арифметика с индексами.Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥8👍6
Прогресс-бар в консоли для долгих операций — наглядный прогресс без UI!
Когда операция выполняется несколько секунд (или минут), пустая консоль выглядит как зависшая. Проще сразу показывать прогресс — например, в виде текстового прогресс-бара.
Нам хватит стандартных пространств имён:
Сделаем простой пример: у нас есть «долгая» операция из 100 шагов. В цикле будем имитировать работу через
Вся магия в методе
Ключевой момент —
он возвращает курсор в начало текущей строки, поэтому новый вывод перезаписывает старую строку прогресса, а не переносит консоль вниз.
В итоге во время работы программы ты увидишь динамически меняющуюся строку:
и по завершении —
🔥 Главное — вынести отрисовку прогресса в отдельный метод и обновлять одну строку через
➡️ C# Ready | #практика
Когда операция выполняется несколько секунд (или минут), пустая консоль выглядит как зависшая. Проще сразу показывать прогресс — например, в виде текстового прогресс-бара.
Нам хватит стандартных пространств имён:
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, тогда консоль не превратится в простыню из сотен сообщений.Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤9🔥5😁2
Переведём сухие числа разницы во времени в живые фразы, чтобы «через час» и «три дня назад» звучали естественно и не требовали пересчёта.
В этой задаче узнаешь:
• Как почувствовать разницу между датами, а не числами;
• Где естественно сказать «назад», а где «через»;
• Почему короткая фраза о времени понятнее таймера.
Когда интерфейс говорит с человеком человеческим языком, время перестаёт быть абстракцией. Пусть твои даты звучат как живые истории, а не скучные отметки в протоколе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍8❤5🤝2