Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Show more📈 Analytical overview of Telegram channel Библиотека шарписта | C#, F#, .NET, ASP.NET
Channel Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) in the Russian language segment is an active participant. Currently, the community unites 21 866 subscribers, ranking 6 212 in the Technologies & Applications category and 30 851 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 21 866 subscribers.
According to the latest data from 10 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -87 over the last 30 days and by -4 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 12.06%. Within the first 24 hours after publication, content typically collects 7.04% reactions from the total number of subscribers.
- Post reach: On average, each post receives 2 638 views. Within the first day, a publication typically gains 1 540 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 8.
- Thematic interests: Content is focused on key topics such as .net, шарписта, навигация, await, string.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Все самое полезное для C#-разработчика в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/b60af5a4
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Thanks to the high frequency of updates (latest data received on 11 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
int result = 10 * 5 + 3 * 2, компилятор прекрасно понимает, что результат всегда будет 56, и именно это число окажется в скомпилированном коде.
public void Example()
{
int result = 10 * 5 + 3 * 2; // Вы пишете это
// Компилятор превращает в:
int result = 56; // Уже посчитано
}
Более интересная оптимизация – constant propagation. Когда вы объявляете константу через const, компилятор запоминает её значение и подставляет его везде, где она используется.
public void ConstantPropagation()
{
const int multiplier = 100;
int value = 42;
int calculated = value * multiplier;
// Компилятор оптимизирует до:
int calculated = value * 100; // multiplier заменен значением
}
Оптимизация строк
С строками всё еще интереснее. Когда вы конкатенируете несколько строковых литералов, компилятор склеивает их в один. Код string message = "Hello" + " " + "World"; превращается в string message = "Hello World";
public void StringOptimization()
{
// Все литералы склеиваются в один
string message = "Hello" + " " + "World";
// Результат: string message = "Hello World";
// С константами тоже работает частично
const string greeting = "Hello";
string name = "Alice";
string message = greeting + " " + name;
// Результат: string message = "Hello " + name;
}
Используйте const там, где это уместно, не бойтесь записывать формулы явно вместо магических чисел – компилятор сам посчитает результат.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминаторgit maintenance is-needed — проверка, нужно ли выполнять задачи обслуживания репозитория.
• git repo info --all — показывает расширенную информацию о структуре репозитория.
• git blame --diff-algorithm=<algo> — теперь можно выбрать алгоритм сравнения при отслеживании изменений.
Улучшения существующих команд
• git replay — теперь выполняет обновление ссылок самостоятельно, не требуя дополнительных команд.
• git fast-import — новая опция --signed-commits=strip-if-invalid для удаления невалидных подписей.
• git apply и git diff — новый класс ошибок пробелов incomplete-line.
И многие другие мелкие доработки.
➡️ Анонс
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#async_newsnamespace MyCompany.PaymentSystem
{
public class PaymentProcessor
{
// ...
}
}
namespace MyCompany.Logging
{
public class Logger
{
// ...
}
}
Зачем нужны namespace
• Без namespace два класса с именем Logger конфликтуют. С namespace можно иметь MyApp.Logger и ThirdPartyLib.Logger одновременно.
• Организация кода по доменам: MyCompany.Ecommerce.Orders, MyCompany.Ecommerce.Products, MyCompany.Ecommerce.Payments.
• Упрощённое использование кода с using
using MyCompany.Ecommerce.Orders;
var order = new Order(); // Вместо: new MyCompany.Ecommerce.Orders.Order()
Можно объявить namespace один раз для всего проекта:
// GlobalUsings.cs
global using System;
global using MyCompany.Core;
Что такое Assembly
Assembly (сборка) — это скомпилированный физический файл на диске .dll или .exe, который содержит IL-код и метаданные.
• .exe — приложение, которое можно запустить.
• .dll — библиотека для подключения.
Как они связаны
Подключение сборки:
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
Это добавляет assembly в проект.
Использование namespace:
using Newtonsoft.Json; // Импортируем namespace
var json = JsonConvert.SerializeObject(obj);
//или без using
var json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
Один работает на уровне файлов, другой — на уровне кода.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминаторpublic int Calculate(int a, int b)
{
return Add(a, b) * 2;
}
private int Add(int a, int b) // JIT заинлайнит автоматически
{
return a + b;
}
Что делает JIT:
public int Calculate(int a, int b)
{
return (a + b) * 2; // тело Add() вставлено напрямую
}
Принудительный инлайнинг:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private int Multiply(int a, int b)
{
return a * b;
}
Не гадайте — профилируйте. Иногда JIT делает лучше без вашей помощи.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_viewSemantic Kernel, но глобальный стандарт задаёт LangGraph. Его киллер-фича — явное управление графом выполнения и состоянием (Stateful Graph).
Это позволяет реализовывать сложные паттерны: Human-in-the-loop (человек подтверждает действие), Time Travel (откат состояния назад) и цикличное планирование. Понимание этих принципов пригодится любому разработчику, внедряющему AI.
Записаться на курс
Погружение в архитектуру агентов: Смотрите вводный урок бесплатно.Random в .NET генерирует псевдослучайные числа для игр, тестов или симуляций. Он работает на основе сида, обычно времени, и дает целые, дробные значения или байты.
Основы класса Random
System.Random создает последовательности чисел через алгоритм. Для простого инта берут Next(min, max), где верхняя граница не включается.
Переиспользуйте один экземпляр, иначе в цикле из-за одинаковых сидов выйдут повторения. Статический или инжектированный через DI вариант подходит для прода:
var rng = new Random();
int число = rng.Next(1, 101); // от 1 до 100
NextDouble возвращает от 0.0 до 1.0, умножьте и сдвиньте для нужного интервала. Байты через NextBytes заполняют массив. Это для тестовых файлов или симуляций.
double температура = rng.NextDouble() * 50 - 10; // от -10 до 40
byte[] буфер = new byte[16];
rng.NextBytes(буфер);
Обычный Random не годится для токенов или паролей, предсказуем при известном сиде. Берите RandomNumberGenerator из System.Security.Cryptography для криптографии.
GetInt32(1, 101) или Fill для байт. В API для ключей всегда крипто-вариант.
Random не потокобезопасен, общий экземпляр сломается. ThreadLocal<Random> создаст по инстансу на поток. Parallel.For с ним работает корректно, без гонок:
var локальныйRng = new ThreadLocal<Random>(() => new Random());
Parallel.For(0, 100, i => {
int значение = локальныйRng.Value!.Next(100);
});
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминаторpublic class User
{
public string Name { get; set; }
public static bool operator true(User? user) => user?.Name != null;
public static bool operator false(User? user) => user?.Name == null;
}
Теперь if (user) сработает если имя задано, иначе попадет в else. Компилятор автоматически вызывает нужный оператор при булевом контексте.
Единственный минус: никто не ожидает такого, код становится загадкой для команды. Лучше стандартные is not null или !ReferenceEquals(null, obj).
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_viewIHttpClientFactory упрощает создание клиентов, интегрируется с DI и решает проблемы вроде утечек сокетов.
Фабрика кэширует обработчики сообщений, управляет их временем жизни и добавляет логирование.
Зачем нужна фабрика
HttpClient из Framework 4.5 часто создают вручную, но это приводит к проблемам: сокеты не освобождаются, DNS не обновляется. Фабрика решает это через пул обработчиков с лайфтаймом в 2 минуты по умолчанию.
Она регистрируется через AddHttpClient в IServiceCollection и дает доступ к CreateClient. Короткоживущие клиенты подходят для большинства случаев, в отличие от долгоживущих с PooledConnectionLifetime.
Предупреждение: если нужны куки, лучше обойтись без фабрики из-за шаринга CookieContainer.
Способы использования
Разработчики выбирают между базовым, именованными, типизированными клиентами или сгенерированными через Refit.
В базовом варианте инжектят IHttpClientFactory и вызывают CreateClient для каждого запроса. Это просто для рефакторинга старого кода.
Именованные клиенты настраивают по имени из конфига, с базовым URI и заголовками вроде User-Agent:
builder.Services.AddHttpClient("MyClient", client =>
{
client.BaseAddress = new Uri("https://api.example.com/");
client.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp");
});
Затем CreateClient("MyClient").
Типизированные удобны для конкретного API: класс принимает HttpClient в конструкторе, фабрика регистрирует его через AddHttpClient<T>.
Логика запросов инкапсулируется в методах класса, DI все подхватывает. IntelliSense работает, нет строковых ключей.
Не используйте в синглтонах: клиент должен быть короткоживущим, иначе DNS не обновится. Лучше именованные или SocketsHttpHandler:
public class ApiService(HttpClient client)
{
public async Task<Todo[]> GetTodos(int id) =>
await client.GetFromJsonAsync<Todo[]>($"todos/{id}");
}
В итоге фабрика делает HTTP-клиенты в .NET предсказуемыми и масштабируемыми. Для прода это как стандарт: меньше багов с соединениями, проще DI.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминаторLangGraph реализует паттерн, где агент — это не просто цепочка плагинов, а граф с состоянием.
Архитектурные преимущества:
— цикличность: нативная поддержка циклов (ReAct pattern);
— state management: управление контекстом похоже на работу с сессиями;
— human-in-the-loop: возможность поставить граф на паузу, получить апрув человека и продолжить.
Курс по архитектуре уже стартовал.
Записаться на курс
Смотреть первую лекцию бесплатно// Добавим NuGet пакет
dotnet add package Microsoft.FeatureManagement
// В appsettings.json
"FeatureManagement": {
"NewDashboard": false
}
В коде:
if (await featureManager.IsEnabledAsync("NewDashboard"))
{
RenderNewDashboard();
}
else
{
RenderOldDashboard();
}
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_viewpublic async Task<IActionResult> ExpireOldOrders()
{
var cutoff = DateTime.UtcNow.AddDays(-30);
var affectedRows = await _db.Orders
.Where(o => o.Status == OrderStatus.Pending
&& o.CreatedAt < cutoff)
.ExecuteUpdateAsync(setters =>
setters.SetProperty(
o => o.Status,
OrderStatus.Expired));
return Ok(new { affectedRows });
}
EF Core сгенерирует один SQL примерно такого вида:
UPDATE Orders
SET Status = 2
WHERE Status = 0
AND CreatedAt < @cutoff
Приложение отправляет в базу одну команду, а не тысячи мелких запросов. С точки зрения БД — это максимально естественный сценарий: нагрузка на сеть и блокировки минимальны.
ExecuteDelete решает такую же задачу для удаления:
public async Task<int> CleanOldLogsAsync(DateTime cutoff)
{
var affected = await _db.Logs
.Where(l => l.CreatedAt < cutoff)
.ExecuteDeleteAsync();
return affected;
}
EF Core не загружает логи в память — удаление происходит одним SQL-запросом.
Важно: эти методы обходят change tracking и не вызывают события SaveChanges.
Используйте их, когда производительность важнее бизнес-логики в коде.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминаторLangGraph, CrewAI и AutoGen;
— интеграция RAG и инструментов планирования;
— 13 живых вебинаров и поддержка менторов.
Поток уже стартовал, присоединяйтесь сейчас.
🚀 Записаться на основной курс
Если сомневаетесь — просто посмотрите вводное занятие.
Available now! Telegram Research 2025 — the year's key insights 
