This media is not supported in your browser
VIEW IN TELEGRAM
Хочешь быстро понять, чем Python отличается от C#, Rust, C++ или Go. Здесь синтаксис, структура, идиомы и концепции разных языков сравниваются в таблицах, так что можно буквально увидеть, как одна и та же задача решается на разных языках. Это отличный способ прокачать мультиязычное мышление, выбрать язык под задачу или просто пронаблюдать сходства и различия.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍7🔥6
Как не лепить try/catch вокруг int.Parse()?
Когда число приходит из UI, JSON, CSV или внешней системы — оно может быть пустым, кривым или с пробелами. Если парсить через
Вместо этого используй
А если при невалидном вводе нужно просто выйти — делай guard clause (код читается сверху вниз, без лишних
🔥 Меньше шума и вложенности, никаких исключений “для контроля потока”, проще обработка пользовательского ввода и меньше шансов словить неожиданный крэш на проде.
➡️ C# Ready | #совет
Когда число приходит из UI, JSON, CSV или внешней системы — оно может быть пустым, кривым или с пробелами. Если парсить через
int.Parse, приходится оборачивать всё в try/catch, и исключения превращаются в “обычный сценарий”.Вместо этого используй
TryParse: он возвращает true/false и не кидает исключения на невалидном вводе:var age = int.TryParse(input, out var parsed) ? parsed : 0;
А если при невалидном вводе нужно просто выйти — делай guard clause (код читается сверху вниз, без лишних
else):if (!int.TryParse(input, out var age)) return;
SaveAge(age);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥7❤5
В этой статье:
• Поймёшь, как объект выделяется в куче и размечается CLR• Увидишь, где берутся заголовок, таблица методов и поля объекта• Разберёшь, что реально ускоряет создание и где ломаются мифы🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3👍3
List patterns в C# 11: проверяем массивы и списки без if-каши!
Иногда нужно быстро понять, что лежит в коллекции: пустая ли она, с чего начинается, чем заканчивается, есть ли конкретная “форма” данных.
Раньше это превращалось в проверки Length и индексов:
Чем больше условий, тем быстрее это разрастается и становится трудно читать.
В C# 11 появились list patterns, которые позволяют матчить коллекцию прямо по её “форме”:
Здесь
🔥 В итоге вместо проверок длины и индексов ты пишешь условия так, как думаешь о данных: по форме коллекции.
➡️ C# Ready | #практика
Иногда нужно быстро понять, что лежит в коллекции: пустая ли она, с чего начинается, чем заканчивается, есть ли конкретная “форма” данных.
Раньше это превращалось в проверки Length и индексов:
int[] numbers = { 0, 5, 7, 10 };
if (numbers.Length == 0)
Console.WriteLine("Пусто");
else if (numbers.Length >= 1 && numbers[0] == 0)
Console.WriteLine("Начинается с 0");
else if (numbers.Length >= 1 && numbers[^1] == 10)
Console.WriteLine("Заканчивается на 10");
else if (numbers.Length == 3 && numbers[2] == 10)
Console.WriteLine("Третий элемент = 10");
else
Console.WriteLine("Другая форма");Чем больше условий, тем быстрее это разрастается и становится трудно читать.
В C# 11 появились list patterns, которые позволяют матчить коллекцию прямо по её “форме”:
int[] numbers = { 0, 5, 7, 10 };
var result = numbers switch
{
[] => "Пусто",
[0, ..] => "Начинается с 0",
[.., 10] => "Заканчивается на 10",
[_, _, 10] => "Третий элемент = 10",
_ => "Другая форма"
};
Console.WriteLine(result);Здесь
_ означает “любой элемент”, а .. означает “любое количество элементов” между ними.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30👍10❤5
На картинке — насыщенная и компактная памятка по ключевым возможностям языка C#: работа с компилятором из командной строки, базовый синтаксис и управляющие конструкции, циклы и условия, описание классов, методов и свойств, а также делегаты, события, структуры и перечисления.
Сохрани, чтобы держать под рукой основу C# и быстрее ориентироваться при разработке и подготовке к собеседованиям.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤5👍3
params удобен, но часто создаёт временный массив — в горячем коде это лишние аллокации и нагрузка на GC. Есть простой трюк: принимать ReadOnlySpan<T> и передавать набор значений без new.В этом посте:
• Поймём, почему params может незаметно создавать массивы;
• Посмотрим, как заменить это на ReadOnlySpan<T> и stackalloc;
• Разберём ограничения Span и где его нельзя использовать.
После гайда вы сможете делать такие “мелкие” оптимизации там, где они реально дают прирост — без усложнения логики и без магии.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤4👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Настольный scratchpad от Джозефа Альбахари: можно быстро писать и запускать C#-скрипты, проверять идеи без создания проектов, а ещё — удобно ходить по данным и джойнить сущности через LINQ или писать обычный SQL.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥5👍3
Как перестать писать “магические строки” в логах и ошибках?
Часто в логирование и исключения попадают строки вроде
Для имён используй
А чтобы автоматически подставлять место вызова (метод/файл/строку) — есть caller info атрибуты:
Теперь ты пишешь просто:
а в выводе уже будет, откуда это пришло.
🔥 Как итог меньше ручных строк, логи и сообщения не “стареют” после переименований, а диагностика становится точнее без дополнительного кода.
➡️ C# Ready | #совет
Часто в логирование и исключения попадают строки вроде
"CreateUser" или "UserService" — и как только ты переименовал метод/файл, эти строки не обновились. В итоге логи врут, а поиск по проекту ломается.Для имён используй
nameof() — он безопасен при рефакторинге:throw new InvalidOperationException(nameof(CreateUser));
А чтобы автоматически подставлять место вызова (метод/файл/строку) — есть caller info атрибуты:
[CallerMemberName] string member = "",
[CallerFilePath] string file = "",
[CallerLineNumber] int line = 0
Теперь ты пишешь просто:
Log.Info("User created");а в выводе уже будет, откуда это пришло.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍6🔥6
with-выражение: обновляем объект без мутаций и лишнего кода!
Иногда нужно изменить всего одно поле, но при этом не трогать исходный объект. Например, обновить имя пользователя, сохранив все остальные значения.
Раньше приходилось создавать новый объект вручную и копировать остальные свойства:
Такой код быстро превращается в копипасту: чем больше полей, тем больше риск забыть что-то перенести или случайно перепутать.
С with-выражением можно скопировать объект и изменить только нужные свойства:
Исходный объект остаётся прежним, а
🔥 Итог: меньше шаблонного копирования, меньше ошибок и удобный путь к иммутабельному коду.
➡️ C# Ready | #практика
Иногда нужно изменить всего одно поле, но при этом не трогать исходный объект. Например, обновить имя пользователя, сохранив все остальные значения.
Раньше приходилось создавать новый объект вручную и копировать остальные свойства:
record User(string Name, int Age, string City);
var user = new User("Анна", 28, "Helsinki");
var updated = new User(
"Анна Петрова",
user.Age,
user.City
);
Console.WriteLine(user);
Console.WriteLine(updated);
Такой код быстро превращается в копипасту: чем больше полей, тем больше риск забыть что-то перенести или случайно перепутать.
С with-выражением можно скопировать объект и изменить только нужные свойства:
record User(string Name, int Age, string City);
var user = new User("Анна", 28, "Helsinki");
var updated = user with { Name = "Анна Петрова" };
Console.WriteLine(user);
Console.WriteLine(updated);
Исходный объект остаётся прежним, а
updated — это новая копия с изменённым значением.Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤8🔥4
Например,
192.168.x.x — для домашней сети, а 10.x.x.x — для крупных корпоративных систем. CIDR (/24, /16, /8) — помогает точно задать размер подсети и количество хостов.На картинке — всё, что нужно знать про IP: диапазоны, маски, специальные адреса, публичные DNS и основы IPv6.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍7🤝5
❤11👍4🔥3🤝1
Как создавать строки без лишних аллокаций?
Самый частый антипаттерн — склеивать строки через
Для обычного кода достаточно интерполяции — она читается лучше и компилятор оптимизирует её:
Но в горячих местах (логи, сериализация, парсинг) есть
🔥 В 90% случаев используй интерполяцию ради читаемости, а
➡️ C# Ready | #практика
Самый частый антипаттерн — склеивать строки через
+. Каждая конкатенация создаёт новую строку, и при активном логировании или форматировании это начинает бить по памяти и GC.Для обычного кода достаточно интерполяции — она читается лучше и компилятор оптимизирует её:
var text = $"Имя: {name}, возраст: {age}";Но в горячих местах (логи, сериализация, парсинг) есть
string.Create, который позволяет сразу записать результат в выделенный буфер:string.Create(length, state, (span, data) => { ... });string.Create оставь для действительно нагруженных участков — меньше аллокаций, меньше давления на GC, больше контроля над созданием строки.Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍4🔥3
На картинке — компактная памятка с самым нужным по C#: каркас программы, основные операторы и выражения, функции и параметры, структуры и примеры работы с данными. Отдельно показан Console I/O: ввод/вывод, escape-последовательности и быстрые примеры преобразований типов.
Сохрани, чтобы быстро освежать синтаксис и не отвлекаться на поиск мелочей во время практики, задач и подготовки к собеседованиям.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6❤5
Пара методов — и твоя программа начинает вести аккуратный журнал событий: что произошло, когда произошло и насколько это важно.
В этой задаче узнаешь:
• Как писать логи в файл одной строкой через File.AppendAllText;
• Зачем нужны уровни INFO/WARN/ERROR и как их удобно оформить через enum;
• Как сделать обёртки, чтобы логирование выглядело красиво и читалось мгновенно.
Один раз собрал — и дальше просто вставляешь в любой проект, чтобы быстрее находить ошибки и понимать, что происходит внутри.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26❤8👍8