Например,
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
Media is too big
VIEW IN TELEGRAM
CSharpier — это инструмент для автоматического форматирования кода на C# по строгим и предсказуемым правилам, предлагая единый стиль форматирования для улучшения читаемости и поддержания консистентности кода.
➡️ C# Ready | #репозиторий
Оставляю ссылочку: Github📱
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥4🤝3
FormattableString: перехватываем интерполяцию строки до того, как она станет string!
Иногда интерполированную строку хочется не просто вывести, а обработать “умно”: например, отправить в лог с параметрами, локализовать, или сохранить шаблон отдельно от значений.
Обычно интерполяция сразу превращается в готовую строку, и ты теряешь структуру:
Здесь в переменной уже обычный string, а исходные значения и формат “слились” в одну строку.
Если принять FormattableString, можно получить и шаблон, и аргументы отдельно:
🔥 Итог: можно логировать и локализовать интерполированные строки правильно — сохраняя шаблон и параметры, а не только готовый текст.
➡ C# Ready | #практика
Иногда интерполированную строку хочется не просто вывести, а обработать “умно”: например, отправить в лог с параметрами, локализовать, или сохранить шаблон отдельно от значений.
Обычно интерполяция сразу превращается в готовую строку, и ты теряешь структуру:
var user = "Анна";
var age = 28;
string text = $"Пользователь {user}, возраст {age}";
Console.WriteLine(text);
Здесь в переменной уже обычный string, а исходные значения и формат “слились” в одну строку.
Если принять FormattableString, можно получить и шаблон, и аргументы отдельно:
FormattableString msg = $"Пользователь {user}, возраст {age}";
Console.WriteLine(msg.Format);
Console.WriteLine(string.Join(", ", msg.GetArguments()));msg.Format вернёт шаблон вида "Пользователь {0}, возраст {1}", а GetArguments() — массив значений, которые подставлялись в интерполяцию.Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥6👍4
В этой статье:
• Поймёшь, как устроены SyntaxTree и SemanticModel без перегруза• Увидишь, как обходить узлы дерева и находить нужные конструкции• Разберёшь минимальный скелет анализатора, диагностики и запуск на проекте🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3🔥3
List.ForEach для компактных действий над списком!
Сейчас научимся быстро выполнять действия над элементами списка без шаблонного цикла foreach — с помощью встроенного метода
Для начала подключим стандартные библиотеки — всё уже включено:
Создадим простой список чисел:
Вот как это обычно делается с использованием стандартного цикла:
Теперь то же самое, но с использованием
Если нужно выполнить более сложное действие — например, вывести квадраты чисел — можно передать лямбда-выражение:
🔥 Метод
➡️ C# Ready | #практика
Сейчас научимся быстро выполнять действия над элементами списка без шаблонного цикла foreach — с помощью встроенного метода
List.ForEach. Для начала подключим стандартные библиотеки — всё уже включено:
using System;
using System.Collections.Generic;
Создадим простой список чисел:
List<int> numbers = new() { 1, 2, 3, 4, 5 };Вот как это обычно делается с использованием стандартного цикла:
foreach (var n in numbers)
Console.WriteLine(n);
Теперь то же самое, но с использованием
ForEach — короче и нагляднее:numbers.ForEach(Console.WriteLine);
Если нужно выполнить более сложное действие — например, вывести квадраты чисел — можно передать лямбда-выражение:
numbers.ForEach(n => Console.WriteLine(n * n));
🔥 Метод
ForEach избавляет от шаблонного кода, делает перебор наглядным и экономит местоPlease open Telegram to view this post
VIEW IN TELEGRAM
❤16👍7🔥4
Как запретить наследование, но оставить удобный with?
Иногда хочется сделать тип “закрытым” для наследования (чтобы никто не ломал инварианты), но при этом сохранить кайф от
Для этого есть
А если нужно чуть больше гибкости (например, добавить необязательное поле), можно использовать record с
🔥 Когда хочешь “immutable + удобно копировать”, но не хочешь наследования и сюрпризов от потомков — делай
➡️ C# Ready | #совет
Иногда хочется сделать тип “закрытым” для наследования (чтобы никто не ломал инварианты), но при этом сохранить кайф от
record: удобное сравнение по значениям и копирование через with.Для этого есть
sealed record — запись, которую нельзя унаследовать, но она всё так же поддерживает with:public sealed record UserDto(string Name, int Age);
var u2 = u1 with { Age = 29 };
with создаёт новый объект, копируя все поля/свойства, и меняет только указанные — идеально для неизменяемых моделей.А если нужно чуть больше гибкости (например, добавить необязательное поле), можно использовать record с
init-свойствами:public sealed record UserDtoV2(string Name, int Age)
{
public string? Email { get; init; }
}
sealed record.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Личный блог инженера из Microsoft, где регулярно выходят разборы .NET/C#, инструменты для разработчиков, советы по продуктивности, заметки про веб/облако и реальный опыт “как это работает в жизни”, а не в вакууме.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤7👍5🤝2