Создаём копию объекта с изменёнными данными!
Иногда нужно взять существующий объект и изменить в нём только одно-два значения.
Например, у нас есть
Создадим пользователя:
Вот что получится:
Теперь допустим, что возраст изменился.
Можно создать новый объект вручную:
Но если свойств много, такой код становится неудобным.
В C# для
Исходный объект при этом остаётся прежним.
Вот что получится при запуске:
🔥
➡️ C# Ready | #практика
Иногда нужно взять существующий объект и изменить в нём только одно-два значения.
Например, у нас есть
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-объекты без ручного копирования всех данныхPlease open Telegram to view this post
VIEW IN TELEGRAM
👍11❤5🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
В этом репозитории собраны десятки книг по разным языкам и направлениям, таким как С# и многое другое. Всё разложено по категориям, поэтому можно быстро найти нужную тему. Здесь есть как базовые учебники по синтаксису и указателям, так и более серьёзные материалы по памяти, низкоуровневой работе и системному программированию.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤7👍6
С их помощью можно легко преобразовывать строки и числа в нужные типы, такие как int, double, bool, а также выполнять универсальное преобразование с помощью ChangeType и работать с Base64 для сериализации и передачи данных. Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🤝5❤3🔥3
В этой статье:
• почему проект быстро становится неуправляемым
• как смешение логики, API и базы усложняет поддержку
• зачем разделять ответственность между слоями🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Почему TryParse() лучше, чем Parse() внутри try/catch?
Когда мы работаем с пользовательским вводом, строкой из файла, query-параметром или данными из внешней системы, невалидное значение — это не что-то неожиданное. Это обычный сценарий, который нужно аккуратно обработать.
Если использовать
Формально это работает, но читается тяжелее.
Приходится воспринимать обычную проверку как исключительную ситуацию.
Гораздо понятнее выглядит такой вариант:
мы пробуем преобразовать значение и заранее готовы к тому, что оно может быть невалидным.
Такой код: легче читать, проще контролировать, лучше подходит для обычной валидации и не превращает ожидаемую ошибку ввода в исключение.
Особенно полезно это при работе с формами, API-запросами, настройками, файлами и любыми данными, которые приходят извне.
🔥 Если ошибка ожидаема — лучше обработать её явно, а не прятать обычную проверку в
➡️ C# Ready | #совет
Когда мы работаем с пользовательским вводом, строкой из файла, 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.Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍5🤝4👎1
Нашёл полезный разбор типичных ошибок в C#-проектах: перегруженные классы, смешение слоёв и слабая декомпозиция.
В статье:
• почему проект быстро становится неуправляемым• как смешение логики, API и базы усложняет поддержку• зачем разделять ответственность между слоями🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4👍3
Почему пустой массив лучше брать через Array.Empty<T>()?
Когда нужно вернуть пустой массив, можно написать так:
На первый взгляд всё нормально. Мы действительно возвращаем массив без элементов.
Но проблема в том, что каждый раз создаётся новый пустой массив. Хотя смысла в этом нет: пустой массив можно переиспользовать.
Лучше использовать готовый вариант:
Такой код сразу показывает намерение: нам нужен именно пустой массив.
Он не создаёт лишний объект и читается как стандартный способ вернуть “ничего, но без null”.
Это особенно полезно в методах, которые часто вызываются.
🔥 Array.Empty<T>() - маленькая привычка, которая делает код чище и убирает лишние выделения памяти.
➡️ C# Ready | #совет
Когда нужно вернуть пустой массив, можно написать так:
return new User[0];
На первый взгляд всё нормально. Мы действительно возвращаем массив без элементов.
Но проблема в том, что каждый раз создаётся новый пустой массив. Хотя смысла в этом нет: пустой массив можно переиспользовать.
Лучше использовать готовый вариант:
return Array.Empty<User>();
Такой код сразу показывает намерение: нам нужен именно пустой массив.
Он не создаёт лишний объект и читается как стандартный способ вернуть “ничего, но без null”.
Это особенно полезно в методах, которые часто вызываются.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17🔥6👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь собрано практически всё для .NET-разработчика: библиотеки, шаблоны, инструменты, ORM, статьи, архитектурные решения и полезные сервисы для backend-разработки на .NET Core. Особенно полезно тем, кто работает с ASPNET Core, микросервисами, Docker и современным backend-стеком. Можно быстро найти готовые решения, нужные инструменты и сильно ускорить разработку.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍5🔥5
scoped в C#: как не дать ссылке “убежать” наружу!
Иногда при работе со
Например, такой код может выглядеть безобидно:
Метод принимает участок строки или буфера и возвращает первые 3 символа. Пока данные живут достаточно долго — всё нормально.
Но в более сложном коде можно случайно попытаться сохранить ссылку на временные данные там, где она жить уже не должна. Особенно это важно при работе с
В C# для таких случаев есть
То есть мы явно ограничиваем время жизни данных и помогаем компилятору поймать опасные сценарии ещё на этапе сборки.
Особенно полезно это выглядит вместе со
Здесь данные лежат на стеке, и
🔥 scoped — способ сказать C#: “эту ссылку можно использовать здесь, но нельзя уносить дальше”.
➡️ C# Ready | #практика
Иногда при работе со
Span<T>, ref и памятью важно не только избежать лишних аллокаций, но и не вернуть наружу ссылку на данные, которые скоро перестанут существовать.Например, такой код может выглядеть безобидно:
static ReadOnlySpan<char> GetPrefix(ReadOnlySpan<char> text)
{
return text.Slice(0, 3);
}
Метод принимает участок строки или буфера и возвращает первые 3 символа. Пока данные живут достаточно долго — всё нормально.
Но в более сложном коде можно случайно попытаться сохранить ссылку на временные данные там, где она жить уже не должна. Особенно это важно при работе с
Span<T>, stackalloc и ref-параметрами.В C# для таких случаев есть
scoped:static void PrintPrefix(scoped ReadOnlySpan<char> text)
{
var prefix = text.Slice(0, 3);
Console.WriteLine(prefix.ToString());
}
scoped говорит компилятору: этот параметр можно использовать внутри метода, но нельзя сохранить так, чтобы ссылка пережила текущий вызов.То есть мы явно ограничиваем время жизни данных и помогаем компилятору поймать опасные сценарии ещё на этапе сборки.
Особенно полезно это выглядит вместе со
stackalloc:Span<int> numbers = stackalloc int[] { 1, 2, 3, 4, 5 };
Print(numbers);
static void Print(scoped Span<int> values)
{
foreach (var value in values)
Console.WriteLine(value);
}Здесь данные лежат на стеке, и
scoped помогает не дать ссылке на них случайно “утечь” наружу.scoped не делает код быстрее сам по себе. Его задача другая — сделать работу с памятью безопаснее и понятнее для компилятора.Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥4
Безопасный API — это не только HTTPS. Нужны authentication, authorization, input validation, rate limiting, audit logs, защита от replay-атак, корректная работа с токенами и ограничение доступа к чувствительным данным.
На картинке — основные практики, которые помогают защитить API от типовых уязвимостей и злоупотреблений.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥4👍3
Требуются парни и девушки в возрасте 19–40 лет, желающие работать в сфере IT.
Опыт в программировании не нужен.
Завтра запускаем бесплатный онлайн-интенсив по Frontend-разработке, где будем показывать, как разрабатывать сайты и веб-приложения в 2026 году без навыков в программировании.
За 7 дней обучения ты:
1. Создашь полноценный веб-сайт на HTML и CSS;
2. Оживишь страницу с помощью JavaScript;
3. Используешь фронтенд-фреймворк Angular;
4. Подключишь Backend и загрузишь сайт на хостинг;
5. Получишь советы по доработке своего проекта;
6. Узнаешь сколько можно зарабатывать и как работать;
7. Поймёшь, как получать заказы на разработку в эпоху нейронок.
А главное, ты увидишь, что разрабатывать сайты и приложения не так сложно, как кажется. И поймёшь, как тебе развиваться в этой профессии, чтобы уже через месяц зарабатывать от 1000$ на вёрстке сайтов.
👉 Проскочить на интенсив бесплатно
🔥 С нас обучение, практика и помощь с выходом на фриланс.
Опыт в программировании не нужен.
Завтра запускаем бесплатный онлайн-интенсив по Frontend-разработке, где будем показывать, как разрабатывать сайты и веб-приложения в 2026 году без навыков в программировании.
За 7 дней обучения ты:
1. Создашь полноценный веб-сайт на HTML и CSS;
2. Оживишь страницу с помощью JavaScript;
3. Используешь фронтенд-фреймворк Angular;
4. Подключишь Backend и загрузишь сайт на хостинг;
5. Получишь советы по доработке своего проекта;
6. Узнаешь сколько можно зарабатывать и как работать;
7. Поймёшь, как получать заказы на разработку в эпоху нейронок.
А главное, ты увидишь, что разрабатывать сайты и приложения не так сложно, как кажется. И поймёшь, как тебе развиваться в этой профессии, чтобы уже через месяц зарабатывать от 1000$ на вёрстке сайтов.
👉 Проскочить на интенсив бесплатно
🔥 С нас обучение, практика и помощь с выходом на фриланс.
😁6
Небольшая консольная утилита, которая создаёт список тестовых пользователей: ID, полное имя, email, телефон и дату рождения — на основе библиотеки Bogus.
В этой задаче:
• Создаём консольный проект на C# и подключаем библиотеку Bogus.
• Генерируем список пользователей с реалистичными данными и локализацией.
• Выводим результат в удобном табличном формате.
Это позволяет быстро наполнять проекты реалистичными тестовыми данными, гибко настраивать формат и локализацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7🔥5