Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Mostrar más📈 Análisis del canal de Telegram Библиотека шарписта | C#, F#, .NET, ASP.NET
El canal Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 21 699 suscriptores, ocupando la posición 5 999 en la categoría Tecnologías y Aplicaciones y el puesto 30 489 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 21 699 suscriptores.
Según los últimos datos del 25 agosto, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -51, y en las últimas 24 horas de -8, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 15.91%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 7.77% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 3 451 visualizaciones. En el primer día suele acumular 1 686 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 25.
- Intereses temáticos: El contenido se centra en temas clave como .net, шарписта, навигация, await, string.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @proglib_adv
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 26 agosto, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
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_люминатор
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
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_люминатор
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_viewEdit → Paste Special → Paste JSON As ClassesIDE сама сгенерирует классы, включая вложенные объекты и массивы. Особенно удобно, когда нужно быстро разобраться с ответом незнакомого API или сделать DTO для прототипа. 💡 А после генерации уже стоит привести классы в порядок: переименовать типы, добавить required/init, атрибуты сериализации и убрать лишнее. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
public readonly struct Point
{
public int X { get; }
public int Y { get; }
public int Sum() => X + Y;
}
Можно пометить readonly и отдельные методы или свойства, если всю структуру сделать неизменяемой нельзя.
in при этом позволяет передавать большую структуру по ссылке без обычного копирования, а readonly-члены помогают избежать защитных копий при работе с такой ссылкой.
Если структура концептуально неизменяемая, readonly struct — хороший выбор по умолчанию. А для больших структур in может снизить стоимость передачи, но его эффект зависит от конкретного сценария ✅
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор
public class User
{
public required string Email { get; init; }
public required string Name { get; init; }
public int Age { get; init; }
}
🔵 Теперь компилятор не позволит создать объект без обязательных свойств:
var user = new User
{
Name = "Ada"
}; // ошибка компиляции
🔵 А такой вариант пройдёт:
var user = new User
{
Email = "ada@x.io",
Name = "Ada"
};
init дополняет эту конструкцию: свойство можно задать при создании объекта, но нельзя изменить обычным присваиванием после инициализации.
Если обязательные свойства заполняются внутри конструктора, можно использовать [SetsRequiredMembers], чтобы сообщить об этом компилятору.
required отвечает за обязательность при создании, а init — за запрет последующего присваивания 💡
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewДля CI/CD это означает простую вещь: вместо регулярной ручной ротации секретов можно настроить Trusted Publishing и вообще убрать долгоживущий NuGet API key из пайплайна.Для обычных scoped API keys NuGet по-прежнему позволяет задавать срок действия самостоятельно. 💡 Если у вас есть автоматическая публикация пакетов, сейчас хороший момент проверить, не хранится ли долгоживущий NuGet API key прямо в CI/CD. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #async_news
NativeAOT переворачивает подход. Компиляция в машинный код происходит заранее, на этапе сборки. На выходе вы получаете самодостаточный нативный исполняемый файл, внутри которого нет ни IL, ни JIT. Приложению не нужен установленный рантайм, оно просто запускается.🔴 Что это даёт. Старт почти мгновенный, ведь разогревать JIT нечего. Память на старте меньше, а размер развёртывания компактнее, потому что лишнее вырезается при сборке. Для консольных утилит, бессерверных функций и контейнеров, где важен быстрый холодный старт, это большой плюс. 🔴 Есть и цена. Раз всё решается на этапе сборки, в рантайме нельзя генерировать код и сильно ограничена рефлексия, ведь компилятор должен заранее видеть, что используется. Часть библиотек, завязанных на динамику, просто не поедет. Плюс сборка идёт под конкретную платформу, и кросс-компиляция не всегда проста. NativeAOT отлично ложится на маленькие быстрые сервисы и утилиты, где ценны холодный старт и компактность. Для больших приложений с тяжёлой рефлексией и динамической загрузкой сначала проверьте совместимость. Включается это в файле проекта.
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминаторbreak выходит только из ближайшего цикла, поэтому приходилось заводить булев флаг и проверять его на каждом уровне, либо прыгать через goto. И то и другое замусоривает логику.
В C# 15 у циклов появились метки, а break и continue научились указывать, какой именно цикл они имеют в виду. Метка ставится прямо на нужный цикл.
outer: for (int row = 0; row < grid.Height; row++)
{
for (int col = 0; col < grid.Width; col++)
{
if (grid[row, col].IsBlocked)
continue outer;
if (grid[row, col].IsGoal)
break outer;
}
}
🔵 Читается ровно так, как задумано. continue outer переходит к следующей итерации внешнего цикла, а break outer полностью выходит из него, минуя остаток внутреннего. Никаких флагов и подсчёта уровней.
Пара нюансов. break можно нацелить и на цикл, и на switch, а continue только на цикл, ведь продолжать switch нечего. И метка привязывается именно к тому циклу, перед которым стоит, поэтому двусмысленности, как с goto, здесь нет.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view.NET Core, EF Core, MAUI, F# и Windows Forms.
Главное изменение это перевод NativeAOT в режим по умолчанию в CLI ради заметно более быстрого старта приложений. Из языка подъехали фичи C# 15, среди них паттерны union и помеченные break и continue для управления вложенными циклами. В библиотеки добавили десятичные типы по стандарту IEEE 754 и шифрование паролем для ZIP.Стабильный .NET 11 ожидается в ноябре, а пока Preview 7 можно использовать как полигон: проверить свои проекты на новом SDK и заранее найти проблемы с совместимостью. 👍 — тестирую превью 🔥 — до релиза даже не трогаю 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #async_news
public void ProcessUser(string name, string email, int age)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException("Value cannot be null or empty.", nameof(name));
if (string.IsNullOrEmpty(email))
throw new ArgumentException("Value cannot be null or empty.", nameof(email));
if (age < 0)
throw new ArgumentOutOfRangeException(nameof(age), "Value must be non-negative.");
// Наконец-то бизнес-логика!
}
Код становился шумным, а реальная логика терялась в океане проверок. Каждый разработчик писал по-своему, сообщения об ошибках отличались, а про опечатки в nameof() вообще молчим.
Теперь всё это превращается в лаконичные однострочники:
public void ProcessUser(string name, string email, int age)
{
ArgumentException.ThrowIfNullOrEmpty(name);
ArgumentException.ThrowIfNullOrEmpty(email);
ArgumentOutOfRangeException.ThrowIfNegative(age);
}
Стандартная библиотека предлагает методы на все случаи жизни:
// Проверки на null
ArgumentNullException.ThrowIfNull(user);
// Числовые диапазоны
ArgumentOutOfRangeException.ThrowIfNegative(temperature);
ArgumentOutOfRangeException.ThrowIfZero(divisor);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count);
// Сравнения
ArgumentOutOfRangeException.ThrowIfGreaterThan(progress, 100);
ArgumentOutOfRangeException.ThrowIfLessThan(quantity, 1);
ArgumentOutOfRangeException.ThrowIfEqual(status, Status.Invalid);
ArgumentOutOfRangeException.ThrowIfNotEqual(version, expectedVersion);
Эти методы — не просто синтаксический сахар. Они воплощают принцип fail-fast: обнаруживай проблемы немедленно, не позволяй невалидным данным распространяться по системе.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
dotnet watch test --filter "Category=Unit»
Эта команда активирует «наблюдение» за исходниками проекта и при каждом изменении автоматически запускает только те тесты, которые помечены категорией Unit.
Вы сразу увидите результаты проверки критичных компонентов, не тратя время на полную прогонку всех тестов.
Если вы хотите параллельно следить и за интеграционными тестами, достаточно изменить фильтр:
dotnet watch test --filter "Category=Integration»
Ещё и интегрировать со скриптами и конвейерами проще простого.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view— Single Responsibility Principle (Принцип единственной ответственности)Каждый класс должен иметь только одну причину для изменения. Плохо: класс UserManager и сохраняет пользователя в БД, и отправляет email. Хорошо: UserRepository хранит, EmailService отправляет письма.
— Open/Closed Principle (Принцип открытости/закрытости)Классы должны быть открыты для расширения, но закрыты для изменения. Новый функционал добавляем через расширение, а не переписывание старого кода. Пример: вместо переписывания метода — создаём новый подкласс или внедряем стратегию.
— Liskov Substitution Principle (Принцип подстановки Барбары Лисков)Объекты подклассов должны работать так же, как объекты родителя. Если Square наследуется от Rectangle, он должен вести себя как прямоугольник, а не ломать ожидания. Суть: наследование не должно рушить логику программы.
— Interface Segregation Principle (Принцип разделения интерфейсов)Лучше много маленьких интерфейсов, чем один огромный. Плохо: интерфейс IMachine с методами print(), scan(), fax(). Хорошо: IPrinter, IScanner, IFax. Каждый класс реализует только нужное.
— Dependency Inversion Principle (Принцип инверсии зависимостей)Зависимости должны быть от абстракций, а не от конкретных классов. Плохо: класс ReportGenerator напрямую вызывает MySQLDatabase. Хорошо: ReportGenerator работает с интерфейсом Database, а уже конкретная БД подставляется снаружи. Без SOLID код быстро превращается в спагетти, где одно изменение ломает всё. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор
Сторонники хранимых процедур говорят: данные уже в базе, меньше сетевых запросов, выше производительность и больше контроля над SQL.
Сторонники логики в приложении отвечают: код проще тестировать, ревьюить, версионировать в Git и переносить между разными СУБД.На практике многие выбирают компромисс: сложные операции над большими объёмами данных оставляют в базе, а бизнес-правила и оркестрацию — в приложении. 💬 А как устроено у вас? 👍 — максимум логики в приложении. 🔥 — сложную логику лучше держать в базе. И был ли у вас проект, где сотни хранимых процедур со временем превратились в «чёрный ящик», который никто не хотел менять? 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #entry_point
Логично, что обучение тоже постепенно приходит к той же модели: не покупать отдельный курс под каждую новую тему, а иметь доступ ко всей библиотеке и выбирать, что актуально именно сейчас.Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке 😎 🔗 Подробнее 🏃♀️ Proglib Academy
