C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Ko'proq ko'rsatish📈 Telegram kanali C# (C Sharp) programming analitikasi
C# (C Sharp) programming (@csharp_ci) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 18 066 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 202-o'rinni va Rossiya mintaqasida 36 422-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 066 obunachiga ega bo‘ldi.
25 Oktabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -28 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 19.39% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 8.27% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 3 504 marta ko‘riladi; birinchi sutkada odatda 1 494 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 0 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent .net, api, логика, архитектура, string kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 26 Oktabr, 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.
SKILL.md для ИИ-агентов. Его можно читать и как обычный технический справочник.
Внутри:
- Поиск узких мест: dotnet-counters, dotnet-trace, Linux perf и анализ машинного кода JIT.
- Память и многопоточность: аллокации, GC, конкуренция за блокировки и false sharing.
- Настройка выполнения: ThreadPool, сокеты, JIT и параметры NativeAOT.
- Оптимизация C#: SIMD, работа со строками и ASP.NET Core.
Автор предлагает подключать документ по необходимости, когда появилась конкретная задача ускорения.
Порядок работы простой: замерить исходную производительность → найти причину → менять по одному параметру → сохранять только измеримый выигрыш.
Часть рекомендаций рассчитана прежде всего на бенчмарки. Настройки могут обменивать память на скорость или увеличивать нагрузку на CPU, поэтому переносить их в продакшен стоит после проверки на своей нагрузке.
https://github.com/EgorBo/BlazingFastDotnetdb.Orders — это DbSet<Order> в EF Core, а NotifyAsync к базе не обращается.
IEnumerable<Order> late = db.Orders
.Where(o => o.DueDate < today);
if (late.Any())
{
logger.LogWarning(
"{Count} late orders",
late.Count()
);
foreach (var order in late)
{
await notifier.NotifyAsync(order);
}
}
Сколько раз код обратится к базе и где будет выполняться подсчёт — в SQL или в памяти приложения?
Обратите внимание на тип late в первой строке. И изменится ли поведение, если заменить IEnumerable<Order> на var?
👇 Пишите ответ с объяснением.IHttpClientFactory создаёт новые экземпляры клиента, но переиспользует обработчики `HttpMessageHandler` и их пулы соединений. Поэтому освобождение клиента, полученного от фабрики, не уничтожает пул после каждого запроса.
Три способа использования:
• Обычный клиент: CreateClient() для простых сценариев. Общие настройки тоже можно задать при регистрации.
• Именованный: CreateClient("github") возвращает клиент с настройками конкретного API.
• Типизированный: GitHubClient получает настроенный HttpClient через DI и скрывает детали HTTP за методами сервиса.
Например, именованный клиент:
services.AddHttpClient("github", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0");
});
// При использовании:
using var client = factory.CreateClient("github");
Нюанс: типизированный клиент не стоит надолго удерживать в singleton без настройки обновления соединений.
Фабрика также не единственный правильный вариант: Microsoft рекомендует и долгоживущий HttpClient с настроенным PooledConnectionLifetime. Главное: управлять временем жизни соединений.global.json сохраняется.
Несколько полезных команд:
dotnetup init # Настроить окружение
dotnetup list # Показать установленные версии
dotnetup update # Обновить отслеживаемые версии
dotnetup sdk install preview # Установить превью SDK
Можно отслеживать обновления внутри конкретной ветки или закрепить точную версию. При обновлении ненужные компоненты очищаются автоматически.
https://devblogs.microsoft.com/dotnet/introducing-dotnetup/.tgz.
• Объединять values.yaml с пользовательскими параметрами.
• Упаковывать чарты и работать с HTTP-репозиториями.
• Устанавливать, обновлять, откатывать и удалять релизы.
• Хранить историю релизов в Kubernetes Secrets, совместимых с Helm v3.
Для начала:
dotnet add package HelmSharp.Action
Поддерживает .NET 8, 9 и 10, лицензия MIT.
Пригодится для собственных панелей управления и сервисов деплоя на C#. Совместимость с Helm пока частичная: свои чарты стоит проверить, особенно если они используют сложные шаблонные функции или расширения.
https://github.com/GaTTGeng/HelmSharpDbContext и подключение с его учётными данными.
• Чужие данные доступны через API, события или специально опубликованные представления с правами только на чтение.
Так случайный запрос к чужой таблице остановит сама база. А выделять модуль в отдельный сервис впоследствии будет проще.
Нюанс: отдельная схема и search_path сами по себе доступа не ограничивают. Границу обеспечивают права ролей на схемы и объекты.
https://milanjovanovic.tech/blog/how-to-keep-your-data-boundaries-intact-in-a-modular-monolith
var c = new Counter();
c.Value = 5;
Console.WriteLine($"{c.Value} {c.Raw} {c.GetRaw()}");
class Counter
{
private int field = 100;
public int Value
{
get => field;
set => field = value;
}
public int Raw => field;
public int GetRaw() => field;
}
Варианты:
A) 5 5 5 😎 5 100 100 C) 5 0 100 D) Код не скомпилируетсяОтвет: **C) 5 0 100** В C# 14 слово `field` внутри аксессоров свойства стало ключевым. Теперь оно означает **скрытое поле, которое компилятор создаёт для этого свойства**, даже если в классе уже есть член с таким именем. Поэтому в этом коде три разных `field`: ``` Value → своё скрытое поле: записали 5, прочитали 5 Raw → тоже аксессор, но со своим скрытым полем: в него никто не писал, значит 0 GetRaw() → обычный метод, ключевое слово тут не действует, это поле класса: 100 ``` Главная ловушка в строке `public int Raw => field;`. Выглядит как обычный метод-однострочник, но это свойство, а значит get-аксессор. Поле класса со значением 100 здесь вообще не видно. До C# 14 этот же код выводил `5 5 5`: все три обращения шли к одному полю класса. После обновления он компилируется и тихо меняет поведение. Чтобы обратиться к старому полю, внутри аксессоров нужно писать `this.field` или `@field`.
.csproj, .props, .targets и C# Doctor для поиска проблем с SDK, восстановлением пакетов и окружением.
Версия доступна в Pre-Release. В VS Code откройте страницу C# Dev Kit и выберите Switch to Pre-Release Version.
https://devblogs.microsoft.com/dotnet/faster-lighter-csharp-dev-kit/ArgumentException, если Precision совпадала со Scale.
• Пул соединений V2 мог выдавать соединения с истёкшими или почти истёкшими токенами доступа. Теперь срок проверяется перед повторным использованием. Исправление касается приложений, явно включивших V2.
• ClearPool и ClearAllPools могли приводить к ошибке при одновременном открытии соединения. Теперь уже начатые запросы могут завершиться, а соединения из очищенного пула больше не используются повторно.
https://github.com/dotnet/SqlClient/releases/tag/v7.1.1√(x² + y² + z²). После этого каждую координату делим на полученную длину.
На скриншотах хорошо видна разница в стиле:
- Rust: iter().fold() собирает сумму квадратов, iter_mut() меняет координаты.
- C#: ReadOnlySpan для чтения, Span для изменения и обычный foreach.
- C++: std::vector, цикл по значениям для расчёта и по ссылкам для изменения.
Для тех, кто пишет на C#: Rust fold(0.0, ...) по смыслу близок к LINQ Aggregate(0.0, ...): оба сворачивают последовательность в одно значение через аккумулятор.
Чей вариант вам понятнее с первого взгляда?