Ru
ГлавнаяКаналыIT → Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET 🕘 история названий (1)

@csharpproglib · IT
21 700подписчиков сейчас
Подписаться в Telegram

Публикации всего: 61

Постов на странице: 10 30 50 Страница 1 из 7
🤩 EF Core: нормальный способ засевать базу В EF Core 9 появились UseSeeding() и UseAsyncSeeding(), а в актуальном EF Core 10 это уже рекомендуемый Microsoft способ для обычного заполнения базы начальными данными.
optionsBuilder
    .UseSeeding((context, _) =>
    {
        if (!context.Set<Role>().Any())
        {
            context.Set<Role>().AddRange(
                new Role { Name = "Admin" },
                new Role { Name = "User" });

            context.SaveChanges();
        }
    });
Плюс в том, что seed выполняется вместе с Migrate и dotnet ef database update, а EF защищает его механизмом блокировки миграций. 🤩 А HasData теперь лучше использовать для статических и детерминированных данных — например, фиксированного справочника. Для данных, зависящих от состояния БД, внешних API или требующих вычислений, Microsoft рекомендует UseSeeding. Если используете async-вариант, реализуйте и UseSeeding, и UseAsyncSeeding — EF tooling пока опирается на синхронный метод. 🔗 Источник 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view
❤ 5 Перейти к публикации →
📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #garbage_collector
😁 17 Перейти к публикации →
👨‍💻 Ложная иммутабельность Часто новички в функциональном программировании думают, что сделали иммутабельный код. Берут список, вызывают ToList() или Select() и радуются новому списку. Но в C# это ловушка. Проблема в ссылочных типах. var copy = original.ToList() создаёт новый List, но все элементы внутри — те же самые объекты. Меняете свойство через copy, и оригинал тоже меняется. Правило трёх: 🤩 Records с init-only свойствами для value-like поведения 🤩 ImmutableList<T> из System.Collections.Immutable — настоящие неизменяемые коллекции 🤩 Struct только для маленьких типов 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view
👍 6 Перейти к публикации →
📎 JsonSerializerOptions в каждом запросе это бомба замедленного действия Вы оптимизировали базу данных. Ничего не изменилось. Оптимизировали сетевые вызовы. Всё ещё медленно. Оказалось, приложение создаёт новый JsonSerializerOptions в каждом запросе. Это уничтожает встроенный кеш метаданных System.Text.Json и превращает JSON сериализацию в дорогую операцию, которая повторяется сотни раз в секунду под нагрузкой. 🤔 Почему это так дорого JsonSerializerOptions это не просто настройки. Это место, где System.Text.Json хранит кэшированные метаданные о том, как сериализовать и десериализовать типы. Каждый новый экземпляр JsonSerializerOptions начинает с пустого кеша. System.Text.Json должна заново анализировать тип, строить информацию о сериализации, кешировать её. Потом запрос закончился и всё выбросилось. Следующий запрос приходит. Новый экземпляр. Пустой кеш снова. Всё сначала. Microsoft так серьёзно относится к этому, что добавили анализатор CA1869, который явно предупреждает: не создавайте JsonSerializerOptions локально в горячих путях. 🤩 Ошибка выглядит безобидно:
string ToJson(object value)
{
    var options = new JsonSerializerOptions(JsonSerializerDefaults.Web)
    {
        WriteIndented = false
    };
    return JsonSerializer.Serialize(value, options);
}
Под нагрузкой это выглядит как: — CPU растёт без видимых причин — Задержка становится нестабильной, p99 скачет — Профилер показывает JSON сериализацию как горячую точку — А вы не понимаете почему, если оптимизировали всё остальное 🤩 Создайте JsonSerializerOptions один раз при старте приложения и переиспользуйте везде:
public static class JsonDefaults
{
    public static readonly JsonSerializerOptions Web = new(JsonSerializerDefaults.Web)
    {
        WriteIndented = false,
        Converters = { new JsonStringEnumConverter() }
    };
}
Используем кеш, никаких затрат
return JsonSerializer.Serialize(payload, JsonDefaults.Web);
Одна переменная, кеш остаётся тёплым, производительность стабильной. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #il_люминатор
👍 25 🤔 2 Перейти к публикации →
🤩 F#: упрощённые иерархии интерфейсов с DIM Раньше при работе с C#-интерфейсами, где базовый слот закрыт через дефолтную реализацию интерфейсов, F# всё равно требовал явно реализовать оба интерфейса. Теперь достаточно реализовать только производный интерфейс. 🤩 Допустим, есть такие C#-интерфейсы:
public interface IA { int M(); }
public interface IB : IA {
    new int M();
    int IA.M() => this.M() + 100;  // DIM покрывает слот IA.M
}
🤩 Раньше F# требовал реализовать и IA, и IB. Теперь достаточно IB:
type C() =
    interface IB with member _.M() = 42
 
(C() 😆 IB).M()   // 42
(C() 😆 IA).M()   // 142 — DIM перенаправляет: this.M() + 100
Улучшение работает не только для простых случаев. Поддерживается ромбовидное наследование, дженерик-интерфейсы, свойства, события, структуры и объектные выражения. Для включения нужен флаг --langversion:preview. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view
😁 4 ❤ 2 🔥 2 · всего 10 Перейти к публикации →
🤨 ConfigureAwait(false). Почему его любят в библиотеках При await .NET по умолчанию старается продолжить выполнение в захваченном контексте. Например, в UI-приложении это позволяет после await снова работать с UI-потоком. Но библиотеке обычно всё равно, в каком контексте продолжать работу. Поэтому там часто пишут:
var data = await httpClient
    .GetStringAsync(url)
    .ConfigureAwait(false);
ConfigureAwait(false) говорит: не нужно возвращать продолжение в исходный контекст. Это особенно важно для библиотек: они не должны предполагать, что вызывающий код использует конкретный UI или другой SynchronizationContext. Есть и классический сценарий с deadlock:
var result = GetDataAsync().Result;
Если GetDataAsync() после await пытается вернуться в занятый контекст, продолжение не может выполниться, а .Result не может завершиться. В ASP.NET Core собственного SynchronizationContext для запросов нет, поэтому классическая проблема с .Result и захватом контекста там не возникает по этой причине. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #il_люминатор
💯 6 👍 4 Перейти к публикации →
🈶 Паттерны and, or и not. Условия, которые читаются как фраза Проверки диапазонов в C# легко превращаются в цепочки сравнений с && и ||. Паттерны позволяют записать их компактнее. С C# 9 условия можно комбинировать прямо внутри pattern matching:
string Grade(int score) => score switch
{
    < 0 or > 100 => "некорректно",
    >= 90 => "отлично",
    >= 60 and < 90 => "нормально",
    _ => "плохо",
};
not особенно удобен для проверок:
if (value is not null)
    Process(value);

if (obj is not string)
    return;
Паттерны можно комбинировать и с проверкой свойств:
bool IsAdultAdmin(User u) =>
    u is { Age: >= 18, Role: "admin" };
Вместо нескольких if получаем одно выражение, где условие читается почти как обычная фраза. 💡 Особенно хорошо такой синтаксис работает там, где нужно описать форму данных или диапазон допустимых значений. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view
👍 15 ❤ 6 🌚 3 Перейти к публикации →
📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #garbage_collector
😁 29 Перейти к публикации →
Visual Studio умеет превращать JSON в C#-классы за пару кликов Не нужен онлайн-конвертер. Копируете JSON и в Visual Studio выбираете:
Edit → Paste Special → Paste JSON As Classes
IDE сама сгенерирует классы, включая вложенные объекты и массивы. Особенно удобно, когда нужно быстро разобраться с ответом незнакомого API или сделать DTO для прототипа. 💡 А после генерации уже стоит привести классы в порядок: переименовать типы, добавить required/init, атрибуты сериализации и убрать лишнее. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view
🤩 19 🥱 12 ❤ 2 · всего 34 Перейти к публикации →
💡 Скрытые копии структур. Зачем нужны readonly struct и in Структуры передаются по значению — это знают все. Но копия может появиться и там, где её совсем не ожидаешь. Представьте структуру с обычным, не readonly, методом. Если она находится в readonly-контексте, например в readonly поле или приходит через in, компилятору приходится защищать значение от изменения. При вызове такого метода он может создать защитную копию структуры. ➡️ Для большой структуры в горячем цикле это уже лишняя работа. Решение — явно обозначить неизменяемость:
public readonly struct Point
{
    public int X { get; }
    public int Y { get; }

    public int Sum() => X + Y;
}
Можно пометить readonly и отдельные методы или свойства, если всю структуру сделать неизменяемой нельзя. in при этом позволяет передавать большую структуру по ссылке без обычного копирования, а readonly-члены помогают избежать защитных копий при работе с такой ссылкой. Если структура концептуально неизменяемая, readonly struct — хороший выбор по умолчанию. А для больших структур in может снизить стоимость передачи, но его эффект зависит от конкретного сценария 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #il_люминатор
❤ 4 🔥 2 👍 1 Перейти к публикации →
1 2 3 6 7

История названий канала

14.08.2026 название Библиотека шарписта Библиотека шарписта | C#, F#, .NET, ASP.NET
Дата — момент, когда изменение заметил наш обход.

Другие каналы категории