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
На картинке — компактная памятка о том, как мыслить в системном дизайне через три главные цели: держать систему доступной 24/7, переваривать большой поток запросов и безболезненно расти по нагрузке и функциональности.
Сохрани, чтобы быстро освежать логику выбора решений и связывать требования бизнеса с метриками и архитектурой перед практикой и собеседованиями.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥5👍4
Raw string literals в C# 11: многострочные строки без экранирования и боли!
Когда нужно вставить JSON, SQL или Regex в код, обычные строки быстро превращаются в ад: везде обратные слеши, кавычки, переносы строк и постоянные ошибки в экранировании.
Раньше приходилось экранировать кавычки и руками добавлять переносы:
Такой код трудно читать, а любая правка JSON превращается в мини-квест.
В C# 11 появились raw string literals — строки в тройных кавычках, где почти ничего не нужно экранировать:
Переносы строк сохраняются как есть, кавычки внутри не нужно экранировать, и текст выглядит ровно так, как он должен выглядеть.
🔥 Итог: идеально для JSON/SQL/Regex — меньше мусора в коде, больше читабельности и меньше ошибок при редактировании.
➡️ C# Ready | #практика
Когда нужно вставить JSON, SQL или Regex в код, обычные строки быстро превращаются в ад: везде обратные слеши, кавычки, переносы строк и постоянные ошибки в экранировании.
Раньше приходилось экранировать кавычки и руками добавлять переносы:
string json = "{\n" +
" \"user\": \"Anna\",\n" +
" \"age\": 28,\n" +
" \"city\": \"Helsinki\"\n" +
"}";
Console.WriteLine(json);Такой код трудно читать, а любая правка JSON превращается в мини-квест.
В C# 11 появились raw string literals — строки в тройных кавычках, где почти ничего не нужно экранировать:
string json = """
{
"user": "Anna",
"age": 28,
"city": "Helsinki"
}
""";
Console.WriteLine(json);
Переносы строк сохраняются как есть, кавычки внутри не нужно экранировать, и текст выглядит ровно так, как он должен выглядеть.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤9🔥7
Почему DateTime.Now иногда ломает сроки действия?
Типичная ошибка — сохранять локальное время сервера и потом сравнивать его с UTC. Выглядит невинно:
Но
А локальную дату оставь для UI — конвертируй в таймзону пользователя:
Итог: UTC для хранения и сравнения, локаль — только для отображения.
➡️ C# Ready | #совет
Типичная ошибка — сохранять локальное время сервера и потом сравнивать его с UTC. Выглядит невинно:
var expiresAt = DateTime.Now.AddHours(1);
if (DateTime.UtcNow > expiresAt) { ... }
Но
Now зависит от таймзоны и DST: окружение поменялось — и сравнения начинают “плавать”. Надёжнее хранить момент времени в UTC, лучше через DateTimeOffset:var expiresAtUtc = DateTimeOffset.UtcNow.AddHours(1);
if (DateTimeOffset.UtcNow > expiresAtUtc) { ... }
А локальную дату оставь для UI — конвертируй в таймзону пользователя:
var expiresForUser = TimeZoneInfo.ConvertTime(expiresAtUtc, userTz);
Итог: UTC для хранения и сравнения, локаль — только для отображения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥5❤4
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥18🤝15❤3
Например,
код 200 означает, что всё прошло успешно, а 404 сообщает, что страница не найдена.Очень полезно держать под рукой, когда работаешь с API или отлаживаешь backend.
На картинке показаны самые часто используемые статусы от 100 до 599.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍10❤9
args[] легко превращается в понятные настройки: флаги включают режимы, --file принимает путь, а всё лишнее аккуратно ловится как ошибка.В этой задаче узнаешь:
• Как разбирать флаги -v/-h без путаницы;
• Как поддержать --file=... и --file ... одним правилом;
• Зачем нужен --, чтобы отделять опции от аргументов.
Такой каркас можно спокойно расширять: добавлять
--out, --mode, команды и нормальные сообщения об ошибках.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍6❤5👎3🤝3