C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Mostrar más📈 Análisis del canal de Telegram C# (C Sharp) programming
El canal C# (C Sharp) programming (@csharp_ci) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 18 305 suscriptores, ocupando la posición 7 337 en la categoría Tecnologías y Aplicaciones y el puesto 36 917 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 18 305 suscriptores.
Según los últimos datos del 11 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -27, y en las últimas 24 horas de 6, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 16.94%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 8.35% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 3 100 visualizaciones. En el primer día suele acumular 1 528 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 0.
- Intereses temáticos: El contenido se centra en temas clave como .net, api, логика, архитектура, string.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 12 junio, 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.
// Проверка: Ticketing-модуль не должен зависеть от Users, Events и т.д.
Types.InAssemblies(ticketingAssemblies)
.That().DoNotHaveDependencyOnAny(otherModules)
.Should().NotHaveDependencyOnAny(otherModules)
.GetResult()
.ShouldBeSuccessful();
// Проверка Clean Architecture:
Types.InAssembly(DomainAssembly)
.Should().NotHaveDependencyOn(ApplicationAssembly.GetName().Name)
.GetResult()
.ShouldBeSuccessful();
✅ Можно проверять любой дизайн:
• Модули — должны вызывать друг друга только через public API
• Слои Clean Architecture — например, Domain не должен ссылаться на Infrastructure
• Правила дизайна — все IDomainEvent должны быть sealed
• Конвенции имен — например, все CommandHandler'ы должны оканчиваться на CommandHandler
🛠 Итого:
• Architecture tests — не просто инструмент, а средство контроля архитектуры
• Работает как компилятор для архитектурных правил — это гарантирует соблюдение структуры
• Идеально подходит для modular monolith, Clean Architecture и крупных систем
• Сдвигает баги из продакшна в CI-пайплайн
🧭 Как начать:
1. Выберите библиотеку (ArchUnitNET, NetArchTest, …)
2. Напишите пару тестов — например, на зависимости между слоями
3. Интегрируйте в CI (GitHub Actions, Azure Pipelines, TeamCity и др.)
4. Соблюдайте — и архитектура останется в целости
🎯 Ключевой вывод
С architecture testing вы не просто «следуете стандартам» — вы автоматизируете дизайн, позволяя команде фокусироваться на логике, а не на структуре. Shift Left не для QA — теперь и архитектура под защитой.
📚 ПодробнееMoney, Email, `Address`)
🛠 В статье:
• Почему использовать Value Objects вместо простых типов
• Как реализовать их в .NET (структура, инварианты, валидация)
• Примеры кода, включая record, struct и кастомные value equality
• Как внедрять их в Entity Framework Core без боли
💡 Отличный материал для тех, кто хочет строить чистую доменную модель и развивать архитектурное мышление.
🔗 Читай статью:
https://www.telerik.com/blogs/domain-driven-design-principles-value-objects-aspnet-core
#DDD #ASPNetCore #ValueObjects #SoftwareArchitecture #Telerik
List<int> numbers = new List<int> { 1, 2, 3, 4 };
foreach (var n in numbers)
{
Console.WriteLine(n);
if (n == 2)
numbers.Remove(n); // 😬
}
❓ Вопрос: Что произойдёт при запуске?
🔍 Разбор
На первый взгляд — ничего особенного. Но при запуске вы получите:
1 2 Unhandled exception. System.InvalidOperationException: Collection was modified; enumeration operation may not execute.💣 Почему так? Потому что `foreach` в C# использует **итератор (Enumerator)**, который **не допускает изменений коллекции во время прохода**. Это встроенная защита от непредсказуемых багов и гонок. ✅ Как можно обойти? Вариант 1 — использовать
for вместо foreach:
for (int i = 0; i < numbers.Count; i++)
{
if (numbers[i] == 2)
{
numbers.RemoveAt(i);
i--; // ⚠️ Обязательно откатить индекс!
}
}
Вариант 2 — создать копию коллекции:
foreach (var n in numbers.ToList())
{
if (n == 2)
numbers.Remove(n);
}
🧠 Вывод:
В C# `foreach` нельзя использовать на коллекциях, которые вы планируете менять в теле цикла. Это распространённая ловушка даже для опытных разработчиков.
📎 Советы:
- При изменениях — лучше for или .ToList()
- Внимательно читайте исключения: InvalidOperationException — ваш друг в отладке
Поделитесь с коллегами — пусть никто не попадается 😊
@csharp_ci@inject или [Inject].
- Service Locator: избегайте этого подхода, так как он усложняет тестирование и нарушает принципы DI.
🔄 Варианты времени жизни сервисов:
- Singleton: один экземпляр на всё приложение.
- Scoped: один экземпляр на сессию пользователя.
- Transient: новый экземпляр при каждом запросе.
💡 Рекомендации:
- Используйте интерфейсы для определения зависимостей.
- Избегайте внедрения Scoped сервисов в Singleton сервисы.
- Для управления временем жизни сервисов используйте OwningComponentBase.
📚 Примеры использования:
- Внедрение HttpClient для выполнения HTTP-запросов.
- Использование NavigationManager для управления навигацией.
- Внедрение IJSRuntime для взаимодействия с JavaScript.
📖 Подробнее читайте в статье
@csharp_cidotnet-counters показывает рост в LOH (Large Object Heap)
- Приложение не падает, но хост начинает свапать и тормозить
- При перезапуске — память очищается, но через 2–3 часа снова заполняется
❗ В логах — тишина, ошибок нет. Библиотеки: Newtonsoft.Json, HttpClient, MemoryCache, EF Core.
---
🧩 Твоя задача:
1. Почему .NET GC может не освобождать LOH, даже при работе GC?
2. Какие действия вызывают накопление в LOH?
3. Как можно отследить, какие объекты скапливаются в памяти?
4. Чем опасен повторный вызов HttpClient или StringBuilder без очистки?
5. Как корректно использовать MemoryCache, чтобы избежать утечек?
💡 Подсказка:
- LOH начинается с объектов > 85,000 байт
- Часто виноваты: большие строки, сериализация, `ToString()`, `MemoryStream`, `Image`, `byte[]`
- `MemoryCache` может хранить сильные ссылки бесконечно, если не задано время жизни
- Частое создание `HttpClient` — может удерживать сокеты в TIME_WAIT и загонять GC в ступор
🛠 Решение:
1. Запускаем профилировщик:
dotnet-gcdump collect -p <PID>
dotnet-gcdump analyze dump.gcdump
2. Смотрим типы с самым большим retained size: List<string>, byte[], MemoryStream
→ В коде — сериализация в JSON огромных объектов без ограничения глубины
3. Находим участок с JsonConvert.SerializeObject(hugeObject) без MaxDepth
4. Исправления:
- Добавить настройки сериализации:
new JsonSerializerSettings { MaxDepth = 5, ReferenceLoopHandling = Ignore }
- Ограничить MemoryCache по размеру:
new MemoryCache(new MemoryCacheOptions { SizeLimit = 100_000_000 });
- Использовать HttpClientFactory вместо new HttpClient() на каждый запрос
5. Альтернатива: перейти на System.Text.Json с Utf8JsonWriter — меньше аллокаций
📌 Вывод:
Даже без явных ошибок .NET-приложение может стабильно "утекать" в LOH — через сериализацию, кэш или неправильную работу с потоками. Только анализ дампа памяти и правильная конфигурация GC и кешей помогут найти такие проблемы.
@csharp_ci.Result и .Wait() — они блокируют потоки. Асинхронность улучшает масштабируемость.
📉 2. Добавь пагинацию
Не отдавай 10 000 записей за раз. Параметры page и pageSize — must-have для любых списков.
🚫 3. Используй `AsNoTracking` в EF Core
Если данные не редактируются — отключай отслеживание изменений. Это экономит память и ускоряет запросы.
📦 4. Включи сжатие ответов
Подключи Gzip или Brotli, особенно если отдаёшь большие JSON-объекты.
🧠 5. Кэшируй часто запрашиваемые данные
Используй IMemoryCache или Redis — уменьши нагрузку на базу.
📤 6. Передавай DTO, а не сущности
Не светите внутренними моделями. Создавай DTO и отправляй только нужные поля.
🧪 Подробнее с примерами кода — в оригинальном сайде:
https://dev.to/this-is-learning/tips-for-improving-api-performance-in-aspnet-core-n4o
@csharp_ciAuthenticationProperties. Он не просто "дополнительные параметры" — это мощный инструмент управления поведением аутентификации.
💡 Что можно сделать с AuthenticationProperties:
• ⏳ Установить срок действия куки:
new AuthenticationProperties { ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1) }
• ↩️ Указать URL возврата после логина:
new AuthenticationProperties { RedirectUri = "/dashboard" }
• 🧭 Добавить временные метки, элементы состояния, флаги:
Например, IsPersistent, IssuedUtc, AllowRefresh, и кастомные значения.
• 🧠 Используется в:
HttpContext.SignInAsync(...)
ChallengeAsync(...) для OIDC
редиректах после логина/логаута
🛠️ Это ключевой объект, если вы хотите более гибко управлять логикой входа, выхода и жизненным циклом сессии в ASP.NET Core.
📎 Полный разбор:
https://blog.duendesoftware.com/posts/20250527-the-role-of-authenticationproperties-in-aspnet-core
@csharp_cidotnet run hello.cs
📌 Что нового:
Без .csproj — пишите и запускайте C#-код как скрипты.
Директивы в файле:
#:package — подключение NuGet-пакетов.
#:sdk — выбор SDK (например, для ASP.NET).
#:property — установка свойств сборки.
Поддержка shebang — делайте .cs-файлы исполняемыми скриптами в Unix-системах.
🛠 Преимущества:
Быстрый старт без лишних настроек.
Идеально для прототипирования и обучения.
Лёгкий переход от скрипта к полноценному проекту с dotnet project convert.
🔗 Подробнее: devblogs.microsoft.com/dotnet/announcing-dotnet-run-app
@csharp_ci
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
