C# (C Sharp) programming
18.8K subscribers
762 photos
38 videos
8 files
674 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🚀 Изучаешь ASP.NET Core?

Репозиторий — это 400+ готовых примеров, от Minimal API до Blazor и SignalR.

Все версии .NET Core — от 2.1 до 10 Preview.
Запуск одним dotnet watch run.

10k+ звёзд на GitHub, must-have для практики!

https://github.com/dodyg/practical-aspnetcore
🔐 Refresh Tokens в .NET: зачем они нужны?

Access tokens имеют ограниченный срок жизни и не подходят для долгосрочной авторизации. Именно поэтому вместе с ними используются refresh tokens.

💡 Как это работает:
1. Пользователь логинится с email и паролем.
2. Система проверяет учетные данные.
3. Генерируется пара токенов:
- Access Token — действует недолго, используется для запросов к API.
- Refresh Token — живет дольше и позволяет получить новый access token без повторного ввода логина и пароля.

📌 Код-пример на C#:

[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginUserDto loginUserDto)
{
IdentityUser? identityUser = await userManager.FindByEmailAsync(loginUserDto.Email);

if (identityUser == null ||
!await userManager.CheckPasswordAsync(identityUser, loginUserDto.Password))
{
return Unauthorized();
}

User? appUser = await context.Users
.FirstOrDefaultAsync(u => u.Id == Guid.Parse(identityUser.Id));

if (appUser == null)
{
return NotFound();
}

string accessToken = tokenProvider.GenerateAccessToken(appUser);
string refreshToken = tokenProvider.GenerateRefreshToken();

return Ok(new AuthResponseDto(accessToken, refreshToken));
}
Что выведет на экран это код?
Anonymous Quiz
22%
1 f 2 f
17%
1 2
37%
1 2 f
13%
1 f 2 f f
11%
🥒
ASP.NET Core: Глобальный обработчик исключений

Красивый и лаконичный пример реализации IExceptionHandler в .NET 8+ через switch`-выражение и сервис `IProblemDetailsService.


internal sealed class GlobalExceptionHandler(
IProblemDetailsService problemDetailsService,
ILogger<GlobalExceptionHandler> logger) : IExceptionHandler
{
public async ValueTask<bool> TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
logger.LogError(exception, "Unhandled exception occurred");

httpContext.Response.StatusCode = exception switch
{
ApplicationException => StatusCodes.Status400BadRequest,
_ => StatusCodes.Status500InternalServerError
};

return await problemDetailsService.TryWriteAsync(new ProblemDetailsContext
{
HttpContext = httpContext,
Exception = exception,
ProblemDetails = new ProblemDetails
{
Type = exception.GetType().Name,
Title = "An error occured",
Detail = exception.Message
}
});
}
}

📌 Что тут важно:

- switch по типу исключения для назначения статуса ответа
- IProblemDetailsService для единообразного формирования ответа
- Логгирование всех необработанных ошибок

🔥 Такой подход делает код чище, централизует обработку ошибок и избавляет от дублирования в middleware.
🚀 Docker + .NET pro tip

Для .NET приложений используйте многоступенчатую сборку: сначала компилируем и публикуем, потом копируем только готовые бинарники в минимальный рантайм-образ.


# Этап сборки
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

# Этап финального образа
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

💡 Преимущества:

- минимальный размер финального контейнера,
- быстрый запуск без SDK, только рантайм,
- меньше уязвимостей благодаря облегчённому окружению.

@csharp_ci
Что выведет на экран этот код?
Anonymous Quiz
49%
42 42 42 42
7%
42 42 42 0
17%
42 0 42 0
7%
42 0 42 42
20%
🥒
.NET 9 — самая быстрая платформа 2025 года

Microsoft прокачала .NET так, что он обгоняет почти все популярные фреймворки: Java, Go, Node.js, Python и даже PHP.

🚀 Что сделали:
- Мусорщик (GC) стал адаптивным → меньше пауз даже при высоких нагрузках.
- JIT-компилятор быстрее разогревает код и оптимизирует горячие участки.
- Векторизация через AVX10 и Arm SVE ускоряет циклы в несколько раз.
- Native AOT уменьшает размер бинарников и ускоряет запуск (контейнеры, IoT, edge).
- Сеть (сокеты, HTTP/3) стала работать быстрее с низкой задержкой.
- JSON обрабатывается через System.Text.Json максимально эффективно.
- Меньше аллокаций → меньше нагрузка на память и GC.
- Thread-pool и многопоточность лучше распределяют задачи по ядрам.
- Минимальные API и оптимизация исключений дали ещё +15% к скорости.

📊 Бенчмарки показывают:
- Java (Spring) — медленнее в 2.5 раза
- Go (Fiber) — в 1.3 раза
- Node.js (Fastify) — в 4 раза
- Python (FastAPI) — в 10 раз
- PHP (Laravel) — в 15 раз
- Ruby (Rails) — в 20 раз

💡 Итог: .NET 9 — быстрый старт, низкая задержка и топ-производительность. Отличный выбор для веба, микросервисов и облака.

#dotnet #performance #benchmark #backend