uz
Feedback
Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET

Kanalga Telegram’da o‘tish

Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

Ko'proq ko'rsatish

📈 Telegram kanali Библиотека шарписта | C#, F#, .NET, ASP.NET analitikasi

Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 21 866 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 6 212-o'rinni va Rossiya mintaqasida 30 851-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 21 866 obunachiga ega bo‘ldi.

10 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -87 ga, so‘nggi 24 soatda esa -4 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 12.06% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 7.04% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 2 638 marta ko‘riladi; birinchi sutkada odatda 1 540 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 8 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent .net, шарписта, навигация, await, string kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

Yuqori yangilanish chastotasi (oxirgi ma’lumot 11 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

21 866
Obunachilar
-424 soatlar
-167 kunlar
-8730 kunlar
Postlar arxiv
🧑‍💻 Закон Хайрама: почему вы не можете изменить свой API Формулировка закона: При достаточном количестве пользователей API
🧑‍💻 Закон Хайрама: почему вы не можете изменить свой API Формулировка закона:
При достаточном количестве пользователей API не имеет значения, что вы обещаете в контракте — все наблюдаемое поведение вашей системы станет чьей-то зависимостью.
Вы создали API. Написали документацию. Явно указали, что гарантируете, а что нет. Но пользователи будут полагаться не только на задокументированное поведение, но и на: • Порядок элементов в ответе • Формат временных меток • Текст сообщений об ошибках • Время отклика • Недокументированные эндпоинты • Побочные эффекты • Баги И любое изменение этого может сломать чей-то прод. Excel и ошибка 1900 года В ранних версиях Excel был баг: 1900 год считался високосным, но таковым не являлся. Пользователи создали сложные таблицы, которые зависели от этого неправильного вычисления. Microsoft не мог просто исправить баг — это сломало бы тысячи таблиц. Ошибка сохранялась до Excel 2003. Даже сейчас есть опция «Enable iterative calculation» для совместимости. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

⭐️ SQL Server в одном файле LocalDB — это SQL Server в одном .mdf файле. Идеально для тестов, локальной разработки и инструментов. Создаётся одной командой, не требует установки сервера. LocalDB — это облегчённая версия SQL Server, которая: работает в режиме пользователя, то есть без сервиса, хранит базу в одном .mdf файле, ведёт себя как настоящий SQL Server и не требует установки полноценного SQL Server. Минимальный рабочий пример:
using Microsoft.Data.SqlClient;
using System.IO;

const string DatabaseName = "TestDatabase";
var databasePath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
    "MyApp", "Data"
);

// Создаём директорию если её нет
if (!Directory.Exists(databasePath))
{
    Directory.CreateDirectory(databasePath);
}

var dataFile = Path.Combine(databasePath, $"{DatabaseName}.mdf");
var logFile = Path.Combine(databasePath, $"{DatabaseName}_log.ldf");

// Безопасное экранирование для SQL
var escapedDbName = DatabaseName.Replace("]", "]]");
var escapedDataPath = dataFile.Replace("'", "''");
var escapedLogPath = logFile.Replace("'", "''");

var masterConnection = new SqlConnectionStringBuilder
{
    DataSource = @"(localdb)\MSSQLLocalDB",
    InitialCatalog = "master",
    IntegratedSecurity = true,
    TrustServerCertificate = true
}.ConnectionString;

var createDbQuery = $"""
    IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'{escapedDbName}')
    BEGIN
        CREATE DATABASE [{escapedDbName}]
        ON PRIMARY (
            NAME = N'{escapedDbName}',
            FILENAME = N'{escapedDataPath}'
        )
        LOG ON (
            NAME = N'{escapedDbName}_log',
            FILENAME = N'{escapedLogPath}'
        )
        COLLATE Latin1_General_100_CI_AI_SC_UTF8;
    END
    """;

using var conn = new SqlConnection(masterConnection);
await conn.OpenAsync();

using var cmd = new SqlCommand(createDbQuery, conn);
await cmd.ExecuteNonQueryAsync();

Console.WriteLine($"База данных создана: {dataFile}");
Будут созданы необходимые файлы и база будет готова принимать подключения. Создание идемпотентное — повторный запуск безопасен. LocalDB работает под текущим пользователем Windows: • Папка должна быть доступна на запись • Не нужны права администратора • Файлы принадлежат пользователю Пакет: Microsoft.Data.SqlClient Требует: LocalDB. Он входит в Visual Studio или SQL Server Express. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

👀 Смотрим видео про URL Работайте с API каждый день, но часто ли задумываетесь, как правильно строить эндпоинты. В видео под
👀 Смотрим видео про URL Работайте с API каждый день, но часто ли задумываетесь, как правильно строить эндпоинты. В видео подробно про пагинацию, query-параметры, фильтры, сортировки, поддомены, порты и пути с версионированием. ➡️ Подтянуть базу про URL 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #il_люминатор

👍 Модификатор protected internal В C# модификатор доступа protected internal открывает доступ к полю, методу или свойству из двух зон. Любые классы внутри той же сборки могут обращаться к такому члену напрямую. Наследники базового класса получают доступ, даже если они в другой сборке. Пример:
public class BaseClass
{
    protected internal int SecretValue = 42;
}
Protected internal оказывается самым широким среди комбинированных, кроме public. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

🟥 Утечки данных в .NET-приложениях чаще происходят не из-за хакеров, а из-за неверной работы с ключами, конфигурациями и базовой криптографией. Ошибки на уровне кода быстро превращаются в инциденты. На открытом уроке разберём практическое применение System.Security.Cryptography: AES, RSA, хеширование и цифровые подписи. Поговорим о безопасном хранении и передаче секретов, управлении ключами и принципе наименьших привилегий. ❗️ Вы системно разберёте уязвимости OWASP Top-10 для .NET: инъекции, небезопасную десериализацию, XSS, CSRF — и способы их нейтрализации на уровне кода и архитектуры. Отдельно обсудим шифрование данных в БД, защиту строк подключения и безопасное логирование без утечек токенов. 🟥Встречаемся 10 февраля в 20:00 МСК в преддверии старта курса «C# Developer. Professional». Зарегистрируйтесь, чтобы не пропустить: https://clc.to/UzMt9g Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

📎 Один файл превращается в полноценное приложение В .NET 10 появилась фича, которая позволяет запускать C# код прямо из одно
📎 Один файл превращается в полноценное приложение В .NET 10 появилась фича, которая позволяет запускать C# код прямо из одного .cs файла без создания проекта. Помимо этого туда можно подключать NuGet пакеты. Директива :package в помощь:
#:package Newtonsoft.Json

using Newtonsoft.Json;

string json = "{\"name\": \"Иван\", \"age\": 30}";
var obj = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine($"{obj.name}, {obj.age} лет");
Первый запуск скачает пакет, дальше все мгновенно. Можно прописать необходимую версию:
#:package Newtonsoft.Json@13.0.3
Это меняет подход к прототипам, утилитам и devops скриптам. Пишем файл, запускаем, выбрасываем. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

📰 Дайджест недели Уже прошла неделя февраля, собрали лучшее за неделю. — Git v2.53 — Фриланс для разработчиков — Миграция с
📰 Дайджест недели Уже прошла неделя февраля, собрали лучшее за неделю. — Git v2.53Фриланс для разработчиковМиграция с GitHubРабота с LLM в .NETВеб-приложение для продуктивности 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #async_news

AI в экосистеме .NET: оставайтесь в тренде Microsoft глубоко интегрировала AI (Semantic Kernel, Copilot) в нашу среду, но при
AI в экосистеме .NET: оставайтесь в тренде Microsoft глубоко интегрировала AI (Semantic Kernel, Copilot) в нашу среду, но принципы работы агентов универсальны. Понимание того, как строятся цепочки ReAct или RAG, необходимо любому сеньору в 2026 году. На курсе мы даём фундаментальную базу и практику (на Python-стеке, стандарте AI-индустрии). Эти знания позволят вам эффективно использовать AI-возможности в C или создавать гибридные системы. Архитектурный фокус: — Оркестрация агентов (принципы применимы и к SK). — Работа с векторными данными в SQL/NoSQL. — Проектирование Stateful-систем с памятью. Погрузиться в архитектуру AI

🧑‍💻 Забытый await: от race condition до DoS-атаки В C# ключевое слово async — это инструкция компилятору превратить метод в
🧑‍💻 Забытый await: от race condition до DoS-атаки В C# ключевое слово async — это инструкция компилятору превратить метод в state machine. await отмечает точку логической приостановки. Всё просто: выполнение не должно продолжаться, пока результат не существует. При await весь код выполняется синхронно, пока не достигнет I/O или функции, возвращающей Task. Если Task не завершён, происходит раскрутка кадра стека, и поскольку обрамляющие методы приостановлены до самого верха, поток может быть освобождён в пул потоков. Позже задача завершается, продолжение планируется и выполнение возобновляется там, где остановилось. Это не параллельное выполнение, это приостановка и возобновление. Если забыли await:
var task = GetDataAsync();
// забыли await
Use(task);
Это режим «запустил и забыл» (fire-and-forget). Последствия: • выполнение продолжается немедленно • зависимость не обеспечивается • исключения выходят за пределы логического стека вызовов Что может произойти с приложением ⚠️ Забытый await может привести к классическому состоянию гонки: код продолжает выполнение до завершения критической операции, например, проверки прав доступа, открывая окно для эксплуатации. Атакующий может успеть получить доступ к данным между моментом начала проверки и её завершением. ⚠️ Когда исключения выходят за пределы логического стека вызовов, они могут быть проглочены без логирования. Это маскирует неудачные попытки аутентификации, SQL-инъекции или другие атаки. ⚠️ Истощение пула потоков как вектор DoS-атаки. При высокой нагрузке неправильное использование async/await приводит к истощению пула потоков. Злоумышленник может намеренно генерировать запросы, эксплуатирующие блокирующие операции. ➡️ Реальные атаки, уязвимости и практики безопасной разработки в Библиотеке хакера 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #il_люминатор

☕️ Веб-приложение для продуктивности Разработчик запустил в продакшн своё веб-приложение для управления временем — The Coffee
☕️ Веб-приложение для продуктивности Разработчик запустил в продакшн своё веб-приложение для управления временем — The Coffee Timer. Проект реализует технику Pomodoro с кофейной эстетикой. Приложение предлагает классический таймер Pomodoro с 25-минутными рабочими сессиями и визуализацией в виде анимированной кофейной чашки. Бэк построен на .NET, фронт —React + TypeScript + Tailwind CSS. В качестве базы данных используется Supabase. Хороший пример современного full-stack проекта с использованием .NET. ➡️ Попробовать приложение 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

Архитектура ИИ-агентов: учим матчасть Пока Microsoft развивает Semantic Kernel, индустрия стандартизирует паттерны на Python.
Архитектура ИИ-агентов: учим матчасть Пока Microsoft развивает Semantic Kernel, индустрия стандартизирует паттерны на Python. Курс «Разработка ИИ-агентов» поможет понять принципы построения таких систем, независимо от вашего основного языка. Что в программе: — графовая оркестрация (LangGraph); — работа с памятью и контекстом (RAG); — мультиагентные протоколы. Кодим на Python (нужны базовые знания), но полученные архитектурные скиллы универсальны. Первая лекция уже доступна. Смотреть лекцию Записаться на курс

❓ Вопрос с собеса Что такое абстракция в ООП? Звучит просто, но можно запутаться между абстракцией, интерфейсами и абстрактны
Вопрос с собеса
Что такое абстракция в ООП?
Звучит просто, но можно запутаться между абстракцией, интерфейсами и абстрактными классами. Ключевое слово здесь — упрощение. Абстракция — ответ в канале с вопросами с собесов Всё остальное — несущественные детали. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #dotnet_challenge

📎 Делимся заметками красиво Вы написали отличную заметку в Markdown в Obsidian, Notion или обычном редакторе, а теперь нужно
📎 Делимся заметками красиво Вы написали отличную заметку в Markdown в Obsidian, Notion или обычном редакторе, а теперь нужно отправить её коллеге или начальнику в Google Docs. Копируете текст и... все форматирование слетает. Заголовки превращаются в решётки ###, списки ломаются, код выглядит убого. Решение: md2cb Простая утилита, которая конвертирует ваш Markdown в богатый HTML и кладёт в буфер обмена. Просто:
cat заметка.md | md2cb
# Ctrl+V в любое приложение
Есть флаг -e для быстрого редактирования:
md2cb -e  # открывает $EDITOR, конвертирует после сохранения
➡️ Репозиторий 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

🤩 Работа с LLM в .NET Microsoft выпустили разбор про то, как работать с AI в .NET. Если вы думали, что интеграция LLM — это
🤩 Работа с LLM в .NET Microsoft выпустили разбор про то, как работать с AI в .NET. Если вы думали, что интеграция LLM — это боль и каша из разных SDK, вот хорошие новости. Microsoft.Extensions.AI — один API для всех Работаете с OpenAI — один SDK. Решили попробовать Ollama — другой API. Захотели Azure OpenAI — третий подход. Microsoft решили эту проблему радикально: один интерфейс для всех провайдеров.
IChatClient client = ...; // любой провайдер
await foreach (var update in client.GetStreamingResponseAsync("How are you?"))
{
    Console.Write(update);
}
Раньше, чтобы получить структурированный JSON, нужно было плясать с бубном и JSON Schema. Теперь:
record Family(List<Person> Parents, List<Person>? Children);
record Person(string Name, int Age);

var family = await client.GetResponseAsync<Family>(
    [
        new ChatMessage(ChatRole.System, "You are an AI assistant..."),
        new ChatMessage(ChatRole.User, "Create a family with 2 parents...")
    ]);
Схему сгенерируют за вас, JSON распарсят, десериализуют. Хотите отправить фото для анализа? Обойдёмся без сотни строк:
var image = new DataContent(File.ReadAllBytes(@"photo.jpg"), "image/jpeg");
var messages = new List<ChatMessage>
{
    new(ChatRole.System, "You are a photo analyst..."),
    new(ChatRole.User, [prompt, image])
};

record ImageAnalysis(string Description, string[] Tags);
var analysis = await client.GetResponseAsync<ImageAnalysis>(messages);
Работает с изображениями, аудио и видео. Один API, middleware, типизация, телеметрия. Можно не изобретать велосипед при каждой смене провайдера. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

☝️ Не повторяйтесь Принцип DRY (Don't Repeat Yourself) — один из самых известных в программировании. Но, как и любой принцип, его можно применять неправильно. Давайте разберёмся, когда следовать DRY, а когда от него отступить. Признаки over-DRYing • Функция с 5+ параметрами:
// Универсальная функция-монстр
public async Task<object> FetchDataAsync(
    string entityType, int? id, string filter,
    int pageSize, bool includeDeleted, params string[] includes) { }

// Специализированные методы
public async Task<List<User>> GetActiveUsersAsync(int page, int pageSize)
    => await _context.Users.Where(u => u.IsActive)
        .Skip(page * pageSize).Take(pageSize).ToListAsync();
• Generic Repository:
// Кажется умным, но бесполезен
public interface IRepository<T> where T : class
{
    Task<T> GetByIdAsync(int id);
    Task<IEnumerable<T>> GetAllAsync();
}

// Специфичный и полезный
public interface IUserRepository
{
    Task<User> GetByEmailAsync(string email);
    Task<User> GetWithOrdersAsync(int id);
}
Когда дублирование правильно • Случайное совпадение:
// НЕ объединяйте! Разные бизнес-концепции
public string FormatUserName(User u) => $"{u.FirstName} {u.LastName}";
public string FormatProductName(Product p) => $"{p.Brand} {p.Model}";
• Разные контексты:
// UI: простая проверка
public bool ValidateEmail(string email) => email.Contains("@");

// API: строгая проверка
public bool ValidateEmail(string email) => 
    Regex.IsMatch(email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$");
Повторите код три раза, прежде чем рефакторить: Первый раз — пишите Второй раз — терпите Третий раз — рефакторьте Дублирование в тестах — нормально:
[Fact]
public void CreateUser_ShouldSucceed()
{
    var user = new User { Name = "Alice", Age = 25 };
    Assert.Equal("Alice", _service.CreateUser(user).Name);
}

[Fact]
public void UpdateUser_ShouldSucceed()
{
    var user = new User { Name = "Alice", Age = 25 }; // OK
    // Читаемость важнее DRY
}
📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

🤖 Миграция с GitHub Если следите за IT-комьюнити, то наверняка замечали: всё больше программистов переезжают с GitHub. Недав
🤖 Миграция с GitHub Если следите за IT-комьюнити, то наверняка замечали: всё больше программистов переезжают с GitHub. Недавно оттуда мигрировали язык программирования Zig и инструмент Leiningen, а за ними — сотни индивидуальных разработчиков. В чём проблема • GitHub стал хуже технически После покупки Microsoft в 2018 платформа деградирует: интерфейс грузится дольше, GitHub Actions запускает джобы случайно и сам интерфейс раздут до безобразия. • Copilot — это плагиат GitHub Copilot буквально выдаёт куски кода дословно. Это нарушение лицензий и воровство чужого кода. Software Freedom Conservancy (те, кто поддерживают Wine, Git, QEMU) организовали кампанию «Give Up GitHub» именно из-за этого. • Закрытая платформа для открытого кода Парадокс: серверная часть GitHub — проприетарный софт. Вы размещаете open-source проекты на закрытой платформе, которую контролирует Microsoft. В отличие от Instagram или Twitter, GitHub не контролирует дистрибуцию контента. Уход с GitHub — это небольшая неудобство для контрибьюторов, но не исчезновение из поля зрения. Куда переезжать Бесплатно и с хостингом: • Codeberg (Forgejo) — некоммерческий проект, для FOSS • SourceHut — платно $4-12/мес, но есть финпомощь • GitLab — бесплатный тариф с ограничениями Самохостинг: • Gitea — простой и лёгкий • Gogs — ещё проще • Gerrit — если нужен продвинутый code review Децентрализация: • Radicle — p2p git • Или просто свой скрипт, заливающий в S3 💬 Где вы держите свои проекты? 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #entry_point

🕶 Работа сама себя не найдёт Senior .NET Engineer — до 450 000₽ с удалёнкой. C# разработчик на удалёнку с ЗП до 250 000 ₽ C#/.NET-разработчик — удалёнка. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта

💡 Фриланс для разработчиков Вы ищете заказы там, где их ищут все. А локальный бизнес даже не знает о существовании биржи. ИП
💡 Фриланс для разработчиков Вы ищете заказы там, где их ищут все. А локальный бизнес даже не знает о существовании биржи. ИП пишут в чатах «посоветуйте программиста» или листает Авито. Будьте там, где нет толпы. ➡️ В статье 9 способов найти первые проекты без бирж 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта