uz
Feedback
C# 1001 notes

C# 1001 notes

Kanalga Telegram’da o‘tish

Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp

Ko'proq ko'rsatish
6 538
Obunachilar
-224 soatlar
-57 kunlar
-330 kunlar
Postlar arxiv
Устал писать тесты с кучей моков? Сложно поддерживать приложение, ведь бизнес логика перемешалась с инфраструктурой? 😰 Присо
Устал писать тесты с кучей моков? Сложно поддерживать приложение, ведь бизнес логика перемешалась с инфраструктурой? 😰 Присоединяйся к нашему практическому курсу по Domain Driven Design, где за 10 вебинаров мы разложим все по полочкам. 🚀Стартуем 1 апреля. Присоединяйся прямо сейчас https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwtV8Fo&utm_campaign=9 Наш курс по Domain-Driven Design позволит вам изучить основы и принципы этого подхода, а также освоить практические навыки, необходимые для успешного применения DDD в реальных проектах. Вы узнаете: ✅ Что такое Domain-Driven Design и почему он так важен для современных разработчиков. ✅ Основы проектирования доменов и формирование предметной области. ✅ Принципы и методы моделирования предметной области, включая разработку моделей предметной области и определение бизнес-правил. ✅ Создание эффективных и масштабируемых сервисов с использованием DDD. ✅ Применение шаблонов проектирования и принципов DDD для оптимизации кода и повышения производительности. Курс ведет действующий архитектор и разработчик Кирилл Ветчинкин. Он успешно реализовал проекты для Мегафона, Теле2, ВСS Brокer. Постоянный спикер крупных IT-конференций. Не упусти шанс стать экспертом! Присоединяйся к нашему курсу и раскрой свой потенциал в разработке успешных проектов уже сегодня https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwtV8Fo&utm_campaign=9 Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwtV8Fo

🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый
🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый быстрый сервер структур данных на всём диком западе: Практически полностью совместим с Redis на уровне API, но при этом: ⏩Имеет либеральную MIT лицензию, как и все последние крупные проекты MS, и этим крайне выгодно отличается от Redis ⏩Написан на C#, и позволяет удобно расширять сервер ⏩Делает по производительности и Redis, написанный на C, и Dragonfly написанный на C++ 🖥 GitHub @csharp_1001_notes

🦾Хардкорный тест по языку С🦾 📌Пройдите полный тест из 20 вопросов на сайте и проверьте, насколько вы готовы к обучению на
🦾Хардкорный тест по языку С🦾 📌Пройдите полный тест из 20 вопросов на сайте и проверьте, насколько вы готовы к обучению на углубленном курсе - «Программист С» от OTUS. Сможете сдать - пройдете на курс с финальной скидкой 10% по промокоду devc10 ⏰ Время прохождения теста ограничено 30 минут 👉ПРОЙТИ ТЕСТ

🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый
🖥 Garnet — кэш от Microsoft, написан на C#, уделывает и Redis, и Dragonfly Как видно из бенчмарков, это сейчас вообще самый быстрый сервер структур данных на всём диком западе: Практически полностью совместим с Redis на уровне API, но при этом: ⏩Имеет либеральную MIT лицензию, как и все последние крупные проекты MS, и этим крайне выгодно отличается от Redis ⏩Написан на C#, и позволяет удобно расширять сервер ⏩Делает по производительности и Redis, написанный на C, и Dragonfly написанный на C++ 🖥 GitHub @csharp_ci

❓Как С#-разработчику вырасти до уровня Senior в 2024? Изучить .NET Framework, Scrum-методики и многое другое на онлайн-курсе
❓Как С#-разработчику вырасти до уровня Senior в 2024? Изучить .NET Framework, Scrum-методики и многое другое на онлайн-курсе «C# Developer. Professional» от OTUS. Программа идеально подходит для начинающих C#-разработчиков, которые хотят развиваться в серверной разработке, создании приложений и микросервисов. На курсе вас ждут: - живые вебинары с возможностью задать вопросы экспертам; - много практики и сильные проекты для портфолио; - поддержка профессионального комьюнити. 👉 Пройдите бесплатный тест прямо сейчас и узнайте, готовы ли вы сделать следующий шаг в карьере: https://otus.pw/t0cH/?erid=LjN8K2M3G Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🖥Что такое NullReferenceException, и как исправить? Итак кейс: выполняется некоторый код, выбрасывается исключение NullRefer
🖥Что такое NullReferenceException, и как исправить? Итак кейс: выполняется некоторый код, выбрасывается исключение NullReferenceException со следующим сообщением:
Object reference not set to an instance of an object (В экземпляре объекта не задана ссылка на объект)
Что же это значит, и как исправить код? ⏩В двух словах Вы пытаетесь воспользоваться чем-то, что равно null (или Nothing в VB.NET). Это означает, что либо вы присвоили это значение, либо вы ничего не присваивали. Как и любое другое значение, null может передаваться от объекта к объекту, от метода к методу. Если нечто равно null в методе "А", вполне может быть, что метод "В" передал это значение в метод "А". ⏩Более подробно Если среда выполнения выбрасывает NullReferenceException, то это всегда означает: вы пытаетесь воспользоваться ссылкой. И эта ссылка не инициализирована (или уже не инициализирована). Это означает, что ссылка равна null, а вы не сможете вызвать методы через ссылку, равную null, как тут:
string foo = null;
foo.ToUpper();
Этот код выбросит исключение NullReferenceException на 2 строке, потому что вы не можете вызвать метод ToUpper() у ссылки на string, равной null. ⏩Отладка Как определить источник ошибки? Общие рекомендации: поставьте точки останова в ключевых местах, изучите значения переменных, расположив курсор мыши над переменной, либо открыв панели для отладки: Watch, Locals, Autos. Если вы хотите определить место, где значение ссылки устанавливается (или нет), нажмите ПКМ на её имени и выберите "Find All References". Затем вы можете поставить точки останова на каждой найденной строке и запустить приложение в режиме отладки. Каждый раз, когда отладчик остановится на точке останова, вы можете удостовериться, что значение верное. Так вы придёте к месту, где значение ссылки не должно быть null, и определите, почему не присвоено верное значение. 📎 Очень подробное обсуждение этой проблемы с примерами @csharp_ci

Смартфон за ваш ответ! Исследовательская компания OMI проводит опрос среди IT-специалистов. Пройдите по ссылке, ответьте на н
Смартфон за ваш ответ! Исследовательская компания OMI проводит опрос среди IT-специалистов. Пройдите по ссылке, ответьте на несколько вопросов и получите шанс выиграть последнюю модель передового смартфона! Примите участие в опросе прямо сейчас — это займет минимум времени.

🖥 Моя коллекция 50+ вопросов для собеса C# https://habr.com/ru/articles/801369/ @csharp_1001_notes

🖥 Интересная статья о паттерне «Спецификация» в С# ⏩О чём статья? О паттерне «Спецификация», который позволяет улучшить стру
🖥 Интересная статья о паттерне «Спецификация» в С#О чём статья? О паттерне «Спецификация», который позволяет улучшить структуру приложения, и, следовательно, увеличить гибкость, уменьшив при этом объем кода, а значит - сократить количество ошибок, но это не точно. ⏩К статье приложен пример Web API приложения, написанный с использованием анемичной доменной модели, библиотеки MediatR, Postgres и Docker Compose. Всё, как Вы любите и, таки да, анемичной доменной моделью мы нарушим инкапсуляцию, без этого никуда. 📎 Статья @csharp_1001_notes

Из бариста в бэкенд-разработчики, из офис-менеджера в UX-дизайнеры. Такие истории интригуют и вдохновляют. Но будут ли работо
Из бариста в бэкенд-разработчики, из офис-менеджера в UX-дизайнеры. Такие истории интригуют и вдохновляют. Но будут ли работодатели в IT серьёзно воспринимать вас, если вы закончите онлайн-курс? Расскажем, что мы делаем в Яндекс Практикуме, чтобы так и было. → Бесплатно, 21 марта в 18:00 Мск На большом онлайн-событии покажем учёбу в Практикуме изнутри. Вы узнаете: — кто поддерживает студентов и не даёт опустить руки до самого трудоустройства; — почему мы добавили в свою платформу YandexGPT и как нейросеть помогает учиться; — кто передаёт студентам знания и навыки, которые нужны в IT прямо сейчас; — как студенты становятся готовыми практиками. → Зарегистрироваться на онлайн-событие

🖥 В чем преимущества асинхронного кода на C#? Разберём на примере. ⏩Вот, полностью асинхронный код: Console.WriteLine("Start
🖥 В чем преимущества асинхронного кода на C#? Разберём на примере. ⏩Вот, полностью асинхронный код:
Console.WriteLine("Start Main");
// Запускаем задачу PrintAsync и спокойно идём дальше
var printTask = PrintAsync();
Console.WriteLine("End Main");
// Ждём завершения задачи PrintAsync
await printTask;

async Task PrintDelayAsync()
{
    // Ждём 3 секунды, но при этом поток не будет занят
    await Task.Delay(3000);
    Console.WriteLine("Print");
}

async Task PrintAsync()
{
    Console.WriteLine("Start PrintAsync");
    // Ждём пока метод отработает, но поток не занят
    await PrintDelayAsync();
    Console.WriteLine("End PrintAsync");
}
⏩Весь этот код может выполняться даже одним потоком, при этом в моменты ожидания await этот поток освобождается может выполнять какие-то другие асинхронные задачи из вашего кода, если они у вас будут. ⏩Пример параллельного исполнения задач:
Console.WriteLine("Start Main");
await PrintAsync();
Console.WriteLine("End Main");

async Task Print1Async()
{
    await Task.Delay(3000);
    Console.WriteLine("Print 1");
}

async Task Print2Async()
{
    await Task.Delay(2000);
    Console.WriteLine("Print 2");
}

async Task Print3Async()
{
    await Task.Delay(1000);
    Console.WriteLine("Print 3");
}

async Task PrintAsync()
{
    Console.WriteLine("Start PrintAsync");
    var tasks = new List<Task>() { Print1Async(), Print2Async(), Print3Async() };
    await Task.WhenAll(tasks);
    Console.WriteLine("End PrintAsync");
}
⏩Вывод:
Start Main
Start PrintAsync
Print 3
Print 2
Print 1
End PrintAsync
End Main
⏩То есть суть в чём — запустились сразу 3 задачи, выполнились они не в том порядке, как были запущены, а где меньше задержка, та раньше и выполнилась. При этом, повторюсь, достаточно одного потока, чтобы выполнять этот код. Что очень существенно, когда речь идёт о сильно загруженных программах типа веб-сервера или какого-то обработчика данных реального времени. @csharp_ci

Вариант для тех, кто ищет виртуальный сервер с хорошей веб-защитой — Aéza: – Виртуальные сервера до 6.0 ГГц на лучших процесс
Вариант для тех, кто ищет виртуальный сервер с хорошей веб-защитой — Aéza: – Виртуальные сервера до 6.0 ГГц на лучших процессорах; – Профессиональная фильтрация атак StormWall; – Круглосуточная поддержка; – Anycast фильтрация; – Низкие цены; – 15% кешбэка по ссылке. Бесконечно можно смотреть на три вещи: на огонь, воду и скидку от Aeza! Говорят: твоё от тебя не уйдет. А зачем ждать? Динозавры тоже ждали и остались в прошлом Используй 50% скидку и погнали в будущее! Кроме того, сейчас Aéza раздает личные бесплатные сервера, забираем тут. Регистрация, подписка, платежи не потребуются. Реклама. Индивидуальный предприниматель Лобанов Леонид Константинович. ИНН 781625705648 erid: LjN8KEr3S

🖥 Обработка ошибок с помощью IExceptionHandler в ASP.NET Core 8.0 Относительно недавно на свет появился ASP.NET Core 8.0, и
🖥 Обработка ошибок с помощью IExceptionHandler в ASP.NET Core 8.0 Относительно недавно на свет появился ASP.NET Core 8.0, и теперь можно обрабатывать ошибки с помощью IExceptionHandler. А вот и полезная статья о том, как это делать. ⏩Вкратце о IExceptionHandler IExceptionHandler — это интерфейс, который предоставляет разработчику обратный вызов для обработки известных исключений в центральном расположении. IExceptionHandler реализации регистрируются путем вызова IServiceCollection.AddExceptionHandler. Время существования экземпляра IExceptionHandler — одноэлементное. Можно добавить несколько реализаций, и они вызываются в порядке регистрации. Если обработчик исключений обрабатывает запрос, он может вернуться true к остановке обработки. Если исключение не обрабатывается обработчиком исключений, то элемент управления возвращается к поведению по умолчанию и параметрам из по промежуточного слоя. Для обработки и необработанных исключений создаются различные метрики и журналы. 📎 Статья 📎 Доки от Windows, как обрабатывать ошибки @csharp_ci

🖥 Задание C# Задача: реализуй на C# метод расширения для строки, который будет проверять, является ли данная строка палиндро
🖥 Задание C# Задача: реализуй на C# метод расширения для строки, который будет проверять, является ли данная строка палиндромом. Палиндром — это слово/фраза/последовательность символов, которая читается одинаково в обе стороны ("шалаш", "ротор", "12321") Получилось? Можешь смотреть код возможного решения @csharp_ci

🖥 Новый пример, показывающий, как использовать открытые API-интерфейсы телеметрии с aspire dashboard, работающим как автоном
🖥 Новый пример, показывающий, как использовать открытые API-интерфейсы телеметрии с aspire dashboard, работающим как автономный контейнер. https://learn.microsoft.com/en-us/samples/dotnet/aspire-samples/aspire-standalone-dashboard/ @csharp_ci

🚀 Text2sql Нейросеть, специализирующаяся на написании SQL-запросов (и не только) по текстовому описанию Описание: A Regex ex
🚀 Text2sql Нейросеть, специализирующаяся на написании SQL-запросов (и не только) по текстовому описанию Описание:
A Regex expression to match a password that contains at least one lowercase letter, one uppercase letter, one digit, one special character, and is at least 8 characters long
Ответ нейросети:
^(?=.*d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;'/?.><,])(?=.*[^s]).{8,}$
🔗 text2sql.ai @sqlhub

⚡Онлайн-Хакатон "Городские Легенды" от Группы компаний Росохрана и ООО «Эпсилон»! 💡Кейсы хакатона: 1. Разработка интерактивн
⚡Онлайн-Хакатон "Городские Легенды" от Группы компаний Росохрана и ООО «Эпсилон»! 💡Кейсы хакатона: 1. Разработка интерактивного голосового помощника с использованием анимированного аватара. 2. Интеграция интерактивного аватара в городскую экосистему цифровых сервисов. 👨‍💻Для кого хакатон? - C++/C#-разработчиков; - Unity-разработчиков; - 3D-Моделлеров; - UX/UI-дизайнеров; - AI-Специалистов; - Команды из 5 человек; - Готовых внедрить любимых персонажей в городскую среду и побороться за главный приз! 🏆Общий призовой фонд - 700 000 рублей! 📅Дата проведения: 11-18 Марта 📍Формат: Онлайн Подробная информация и регистрация: https://tglink.io/05539cf28394?erid=LjN8KWcqb

⚡️ Каждый разработчик должен знать о тестовых контейнерах. Это отличный инструмент, который нужно знать и применять, когда он
⚡️ Каждый разработчик должен знать о тестовых контейнерах. Это отличный инструмент, который нужно знать и применять, когда он вам понадобится. Вот пример работы с Testcontainersна .NET: https://testcontainers.com/guides/getting-started-with-testcontainers-for-dotnet/ #dotnet #csharp #fsharp @csharp_1001_notes

🖥 Параллельная Публикация Уведомлений в MediatR MediatR — это популярная библиотека с простой реализацией паттерна посредник в .NET. Посредник — паттерн шаблон проектирования, обеспечивающий взаимодействие множества объектов, формируя при этом слабое зацепление и избавляя объекты от необходимости явно ссылаться друг на друга. С ростом популярности паттерна CQRS MediatR стала популярной библиотекой для реализации команд и запросов. Издатель — подписчик — поведенческий шаблон проектирования передачи сообщений, в котором отправители сообщений, именуемые издателями (англ. publishers), напрямую не привязаны программным кодом отправки сообщений к подписчикам (англ. subscribers). Но она также поддерживает паттерн издатель-подписчик с использованием уведомлений. Можно опубликовать экземпляр INotification, и несколько подписчиков обработают опубликованное сообщение. Разберемся как это можно делать параллельно. Нам нужен класс, реализующий INotification:
public record OrderCreated(Guid OrderId) : INotification; А также реализация соответствующего INotificationHandler:
public class OrderCreatedHandler : INotificationHandler<OrderCreated> { private readonly INotificationService svc; public OrderCreatedHandler( INotificationService service) { svc = service; } public async Task Handle( OrderCreated notification, CancellationToken ct) { await svc.SendOrderCreatedEmail( notification.OrderId, ct); } }
Теперь можно публиковать сообщение с помощью IMediator или IPublisher:
await publisher.Publish( new OrderCreated(order.Id), cancellationToken);
MediatR вызовет все соответствующие обработчики. До 12й версии MediatR стратегия публикации вызывала каждый обработчик по отдельности. Однако появился новый интерфейс INotificationPublisher, управляющий тем, как вызываются обработчики.
Реализация по умолчанию - ForeachAwaitPublisher:
public class ForeachAwaitPublisher : INotificationPublisher { public async Task Publish( IEnumerable<NotificationHandlerExecutor> executors, INotification notification, CancellationToken ct) { foreach (var e in executors) { await e .HandlerCallback(notification, ct) .ConfigureAwait(false); } } }
Она вызывает обработчики по одному и завершается неудачей при ошибке в одном из обработчиков.
Но вы также можете использовать TaskWhenAllPublisher (показаны только отличия в реализации метода Publish:
var tasks = executors .Select(e => e.HandlerCallback(notification, ct)) .ToArray(); return Task.WhenAll(tasks);
TaskWhenAllPublisher вызывает все обработчики одновременно и выполняет их все независимо от того, возникали ли в них ошибки. Если вы сохраните задачу, возвращенную TaskWhenAllPublisher, вы можете получить доступ к свойству Task.Exception, содержащему экземпляр AggregateException, и реализовать обработку исключений.
Настройка стратегии публикации происходит в методе AddMediatR. Если вы хотите использовать стратегию TaskWhenAllPublisher, вы можете: - указать значение для свойства NotificationPublisher (тогда издатель будет синглтоном), - указать тип стратегии в свойстве NotificationPublisherType и использовать свойство ServiceLifetime для задания времени жизни:
services.AddMediatR(cfg => { … cfg.NotificationPublisher = new TaskWhenAllPublisher(); // или cfg.NotificationPublisherType = typeof(TaskWhenAllPublisher); cfg.ServiceLifetime = ServiceLifetime.Transient; });
Вы также можете реализовать пользовательский экземпляр INotificationPublisher и вместо этого использовать собственную реализацию.
Плюсы Параллельного запуска обработчиков уведомлений обеспечивает значительное повышение производительности по сравнению с поведением по умолчанию. Однако обратите внимание, что все обработчики будут использовать одну и ту же область видимости. Если у вас есть экземпляры сервисов, которые не поддерживают конкурентный доступ, вы можете столкнуться с проблемами. К сожалению, одним из таких является EF Core DbContext. 📌 Подробнее @csharp_1001_notes

⚡️ AspNetCore.ApiGateway Представляем крутой инструмент: микросервис с конвейером запросов #ASPNETCore. Без проблем перейдите
⚡️ AspNetCore.ApiGateway Представляем крутой инструмент: микросервис с конвейером запросов #ASPNETCore. Без проблем перейдите от веб-интерфейса #ASPNETCore к Veritas API Gateway, в который входят, Swagger, методы авторизации, фильтры, балансировщик нагрузки и многое другое. ▪ Github @csharp_1001_notes