Обновить
110.19

.NET *

Хаб со знаниями про .NET

Сначала показывать
Порог рейтинга
Уровень сложности

Современный C# для начинающих и джунов. Часть 1

Уровень сложностиПростой
Время на прочтение31 мин
Охват и читатели7.7K

Большинство гайдов по C# в Интернете или давно утратили актуальность, или содержат лишь небольшие вкрапления новых возможностей, но лишены последовательности. Есть и другая крайность - ИИ простыни сгенерированного текста под видом статей, которые очень тяжело читать. Я хочу сделать свою попытку изменить ситуацию.

Читать далее

Новости

UNITY: Реализация движений для динамичного шутера. Часть 2

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели7.1K

С момента прошлой статьи прошло достаточно много времени и я заметил одну интересную вещь: немало людей добавили статью в закладки, несмотря на небольшое число отметок “нравится”. Это убедило меня в полезности материала и потому я решил написать вторую часть.

Читать далее

Как изучить программирование за 7 дней (до конца новогодних праздников)?

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели17K

Перфолента.NET — это на удивление профессионально выглядящий язык программирования на платформе .NET, который поддерживает объектно-ориентированное и функциональное программирование, и на котором написан даже написан другой язык, функциональный язык программирования — Перфо.NET (интерпретатор).

Мой личный опыт

Когда я начал немного программировать на Перфоленте/Перфо, моё понимание языков программирования сильно изменилось. Я почувствовал себя как англоязычный программист, пишущий код на родном языке.

Это был очень интересный опыт. Я стал больше внимания уделять смыслу слов и терминов, стал строже относиться к названиям.

Раньше сложные понятия функционального программирования давались мне тяжело, но теперь всё стало проще. Лямбда-функции, замыкания, каррирование и т.д. — всё это я теперь понимаю по-другому. Особенно когда объясняю ребёнку.

Например, лямбда-функция — это просто формула из задачника по математике. Ребёнок понял это сразу! И мы пошли дальше, не останавливаясь.

По-моему, главный эффект даёт отказ от псевдонимов и алиасов. Я долго отучался давать названия, из которых сразу понятно, что это за сущность, а не «имена, которые означают...».

Второй эффект — это «сокращение контекста». Контекстное окно человека ограничено 3–5 вещами, которые он в состоянии держать в голове и обдумывать. «Псевдонимы/алиасы» съедают это контекстное окно. Поэтому избавление от прокладок в виде «print — это печать» и замена их на простые «вывести_в_консоль», «вывести_в_файл» и т.п. сильно облегчают понимание логики кода.

Читать далее

JsonToLinq – автоматическая конвертация фильтров из JSON в LINQ Expression деревья

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели8.8K

Используй JSON для создания LINQ-выражений!

Если черный ящик поддерживает входные сигналы в форме JSON, то им могут пользоваться самые разные клиенты!

Читать далее

Дышать или не дышать? Как я написала библиотеку и Telegram-бота для мониторинга воздуха в Ташкенте

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели7K

Доброго времени суток, уважаемые хабровчане! Я живу в Ташкенте.

Как превратить беспокойство о качестве воздуха в полезный Open Source проект?

Читать далее

Как поменяется .NET и C# в ближайшие годы?

Время на прочтение3 мин
Охват и читатели13K

Внимание! Эта статья не является «серьезной аналитикой». Только мои мысли и наблюдения.

Любите наблюдать за развитием дотнета? Вот, и я люблю. В данный момент не существует опубликованного списка изменений для будущих .NET 11 и C# 15, не говоря уж о более поздних версиях. Даже Devblogs пока хранит молчание. Благо, что C# - быстро развивающийся язык, и кое-что мы можем понять даже сейчас, если посмотрим, над чем активно ведется работа, а так же по запрашиваемым сообществом фичам.

Читать далее

Топ-10 ошибок, найденных в C# проектах за 2025 год

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели9.1K

В 2025 году команда PVS-Studio продолжила разбирать код открытых C#-проектов. За год было обнаружено немало дефектов, и из всего этого разнообразия мы выбрали 10 наиболее любопытных. Надеемся, что этот обзор будет не только интересным, но и полезным — приятного чтения!

Читать далее

Интересный заголовок. Посвящается Сибуру и их призывам идти работать на завод

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели63K

IT-специалистам на заводах РФ посвящается. Создаю контраст в противопоставление статьям Сибура про работу в IT на заводах

Читать далее

Использование Lazy<T> с Dependency Injection в .NET

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели8.1K

Dependency Injection (DI) — это популярный механизм внедрения зависимостей, который идеально соответствует принципам SOLID (Dependency Inversion Principle). В .NET использование DI (Microsoft.Extensions.DependencyInjection) стало стандартом де-факто.

Однако у DI есть важный недостаток: при создании корневого объекта (например, контроллера) контейнер резолвит всё дерево зависимостей, что плохо для памяти и производительности.

Решение - использование DI с Lazy<T> — ленивая инициализация зависимостей.

Читать далее

Облачный абордаж: как Space Pirates остается в инфраструктуре, растворяясь в трафике легитимных облачных сервисов

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели5.6K

APT-группировка Space Pirates и облачные C2-каналы: LuckyStrike Agent с C2 на базе Yandex Cloud и новый бэкдор PhantomCloud, использующий OneDrive и Dropbox для скрытого управления — обо всём этом мы поговорим в этой статье.

Читать далее

Dynamic в C#: когда использовать

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели8.3K

В 2010 году в C# 4.0 появилось ключевое слово dynamic. Тогда казалось, что это очень круто — наконец‑то можно обойти строгую типизацию там, где она откровенно мешает. Прошло пятнадцать лет, и эйфория давно улеглась. Теперь dynamic воспринимается скорее как специализированный инструмент с узкой областью применения.

Читать далее

Раскрываем мощь Zlib и немного Brotli в .NET

Время на прочтение5 мин
Охват и читатели8K

В .NET Core 2.1 Microsoft добавила поддержку Brotli-компрессии, предоставив разработчикам привычный контракт на базе Stream.

Идея проста: вы оборачиваете поток с несжатыми или сжатыми данными в BrotliStream и читаете или пишете данные, как обычно.

Читать далее

Как я писал систему, которая упростит поиск квартиры мечты

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели15K

Покупка квартиры — достаточно сложное и дорогое дело. Хочется выбрать лучшее из того, что есть на рынке и не прогадать по цене. С такими мыслями наша семья начинала поиски квартиры на вторичном рынке в Санкт Петербурге в начале 2023 года.

Объявления в России принято искать на многочисленных площадках с недвижимостью: Циан, Авито, Дом Клик и так далее У каждой свои механики и множество объектов недвижимости. Я пытался просмотреть все, которые подходили по параметрам «станция метро», «время до метро», «максимальная цена», «минимальная площадь». Но вскоре понял, что это занимает слишком много времени ежедневно.

Читать о приключении на 20 минут

Ближайшие события

Bulkhead: разделяем ресурсы, чтобы один запрос не блокировал остальные

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели5.3K

Сегодня разберёмся с Bulkhead-паттерном в коде .NET. Bulkhead, своего рода защитная клетка для ваших ресурсов. Суть в том, чтобы изолировать группы запросов или операций так, чтобы отказ или перегрузка в одной ячейке не утопила всю систему. Без разделения лёгкий запрос может ждать, пока тратится весь пул потоков тяжёлой задачей.

Благодаря Bulkhead каждый поток или потребитель получает выделенный пул ресурсов и может работать даже при сбое или загрузке других. Это помогает предотвратить большое и ненужное расходование ресурсов, если один сервис начинает есть всё CPU или соединения, его проблемы останутся в его же сегменте.

Разобрать Bulkhead

Использование ИИ в поиске Гостендеров

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели4.9K

В этой статье я расскажу как я использовал новейшие возможности ИИ MSSQL 2025 для поиска гостендеров. Текущую рабочую версию я выложил на https://artemtender.ru

Не секрет, что сейчас тяжелые времена для программистов, тем более если тебе за 40, 80% резюме даже не доходит до рекрутеров. Я попробовал поискать работу на гостендерах. Не смотря на то, что общее мнение в том, что большая часть предложений там не рентабельна, с помощью вайбкодинга можно было бы вытянуть проект в плюс.

Оказалось что на zakupki.gos.ru найти что-то не реально. Там нет нормального фильтра, нужно вручную просматривать сотни позиций, и то позиция может выглядеть просто как "Разработка и поставка ПО". Дальше нужно скачивать документацию вручную и читать. Первая мысль - нужно скармливать Chat GPT и спрашивать подходит ли заказ лично мне. С этим он справляется неплохо, но нужно в начале эту позицию найти, а с этим он уже не справится.

Решение следующее - необходимо зарегистрироваться в системе госзакупок и получить токен на получение данных. Для поиска позиций я использую косинусную сходимость. Тут очень пригодился новый тип Vector в MSSQL. В базе он выглядит так: [Vector] vec NULL. Этот тип уже поддерживается новейшим EF Core. Все названия закупок индексируются помощью модели ai-forever/ru-en-RoSBERTa методом проб и ошибок я выбрал ее. Подскажите в комментариях, может быть есть что то и лучше. Микросервис на пайтоне получает batch запрос на индексацию и через RabbitMQ возвращает в микросервис обработки БД на .NET Core. В профиле пользователь создает товары и услуги которые так же индексируются через поле Vector. Поиск и сравнение идет уже средствами самого MSSQL и в результате все работает довольно быстро. Скан нескольких сотен тысяч позиций происходит в реальном времени. Единственно, сама индексация не столь быстрая, поэтому я вынес в профиль. Кроме того, по моему это просто удобно - ведь твои услуги меняются не так часто и их проще выбрать из списка. В моем веб-приложении https://artemtener.ru это выглядит так:

Читать далее

Автоматизируем HR-процессы в Додо. Часть 1

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели5.3K

Автоматизация HR-процессов — многоступенчатый процесс. Сначала нужно решить проблему малой группы, HR-команды, освободив ей руки, а потом — всех сотрудников компании. В общем, продуктовый подход тут не роляет.

Узнали мы это, когда разрабатывали свою HR Platform. Как мы это делали и какие проблемы решали в процессе — я расскажу в своих статьях. Начнём с путешествия в 2018 год, когда мы даже не могли точно сказать, сколько человек работает в управляющей компании Додо. Вперёд в прошлое!

Вернуться в 2018

Ваш кэш в .NET не защищён от cache stampede

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7K

У вас есть запрос к базе данных или к платному API, и вы кэшируете результат? Для кэша используете ConcurrentDictionary или MemoryCache?

У кэша, построенного на этих классах, есть одна неприятная проблема: отсутствие защиты от давки кэша (cache stampede). При определённой нагрузке кэш будет многократно выполнять один и тот же запрос из-за отсутствия координации между потоками и репликами. В этой статье я наглядно покажу, как давка кэша влияет на C# приложение и что с этим делать.

Читать далее

Await своими руками в C#

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели11K

Привет, Хабр!

Многим кажется, что await работает только с Task и ValueTask, но на самом деле язык позволяет сделать любой объект ожидаемым — нужно лишь реализовать определённый паттерн.

Итак, зачем нужен свой await? Бывают случаи, когда вам хочется написать асинхронный метод, но результат приходит не из готового Task или таймера. Например, ждёте какое-то событие, изменение файла, считывание из сокета, или просто хотите встроить задержку без запуска Task. Когда вы пишете await expr, компилятор в глубине понимает так: берётся результат expr.GetAwaiter(), затем вызывается awaiter.IsCompleted. Если false, он подписывается на awaiter.OnCompleted, когда завершится, и потом берёт awaiter.GetResult().

Читать далее

ReadyToRun и Crossgen2: AOT-компиляция в .NET

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели4.3K

Привет!

Разберём ReadyToRun (R2R) — технологию предкомпиляции в .NET. Многие включают её, надеясь на супер ускорение, а потом удивляются результатам. Посмотрим, как это работает на самом деле и где реально помогает.

ReadyToRun — это AOT-компиляция для .NET. Обычно приложение поставляется в IL-коде, который JIT превращает в машинный код во время выполнения. R2R компилирует код заранее при публикации проекта — в итоговых DLL лежит и IL, и готовые машинные инструкции. При запуске CLR просто берёт нативный код без пауз на компиляцию.

Как это работает

Гайд: Как прострелить ноги unsafe кодом в C#

Уровень сложностиСложный
Время на прочтение30 мин
Охват и читатели9.1K

ДИСКЛЕЙМЕР: Это статья является ручным переводом оригинальной статьи с небольшими пояснениями. Поводом для перевода стало слишком частое использование unsafe кода в других статьях о C# на русском языке в том числе тут на хабре.

Читать далее
1
23 ...

Вклад авторов