Мы ищем участников для интервью на тему «Обучение навыкам в IT»!
Кто нам нужен?
Что вас ждет?
Участие в интервью по Zoom, которое займет не больше 45 минут.
Уникальный шанс пообщаться с нашим CEO!
Как откликнуться?
Please open Telegram to view this post
VIEW IN TELEGRAM
Как часто вы задумывались о том, какие размеры имеют окна на вашем экране? Для разработчиков, гейм-дизайнеров и дизайнеров интерфейсов это порой становится важным вопросом. Здесь на помощь приходит LiveWinSize — лёгкая утилита, которая делает измерение окон точным и быстрым.
Реальные размеры: помимо пикселей, вы можете видеть размеры в сантиметрах или дюймах.
Лёгкость: приложение весит всего 1,75 МБ.
Простота: минимальный интерфейс, всё, что нужно — запуск и информация о размере окна уже перед вами.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🚀Как ускорить LINQ: полезные трюки
1️⃣ Избегайте повторной обработки коллекций
Повторный вызов методов LINQ, таких как Where, приводит к повторному перебору коллекции.
✅ Решение: кэшируйте результаты, если они используются несколько раз:
2️⃣ Используйте ForEach вместо Select, если результат не нужен
Использование Select для выполнения действий без необходимости возвращать коллекцию увеличивает накладные расходы.
✅ Решение: используйте ForEach для простого выполнения действий:
3️⃣ Избегайте использования Count для проверки на пустоту
Count перебирает всю коллекцию, что замедляет выполнение.
✅ Решение: используйте Any() вместо Count():
4️⃣ Параллельное выполнение (PLINQ)
Обработка больших коллекций может быть медленной.
✅ Решение: используйте PLINQ для параллельного выполнения:
5️⃣ Проекционная оптимизация (Select)
Извлечение всех данных, когда требуется только несколько полей.
✅ Решение: Используйте Select для выборки только необходимых данных:
6️⃣ Фильтрация перед проекцией
Проекция больших объёмов данных перед фильтрацией замедляет запрос.
✅ Решение: сначала фильтруйте, затем проецируйте:
🐸 Библиотека шарписта
#tip
Повторный вызов методов LINQ, таких как Where, приводит к повторному перебору коллекции.
var filtered = myCollection.Where(x => x.Age > 30).ToList(); // Выполняется один раз
var count = filtered.Count;
var average = filtered.Average(x => x.Salary);
Использование Select для выполнения действий без необходимости возвращать коллекцию увеличивает накладные расходы.
myCollection.ForEach(x => Console.WriteLine(x.Name));
Count перебирает всю коллекцию, что замедляет выполнение.
if (myCollection.Any()) // Быстрее, чем myCollection.Count > 0
Обработка больших коллекций может быть медленной.
var result = myCollection.AsParallel()
.Where(x => x.IsActive)
.ToList();
Извлечение всех данных, когда требуется только несколько полей.
var names = myCollection.Select(x => x.Name).ToList();
Проекция больших объёмов данных перед фильтрацией замедляет запрос.
var result = myCollection.Where(x => x.Age > 30)
.Select(x => x.Name)
.ToList();
#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Microsoft выпустила обновление .NET 9.0.1, которое в первую очередь сфокусировано на устранении уязвимостей.
Вот ключевые моменты:
#новость
Please open Telegram to view this post
VIEW IN TELEGRAM
Если вы ищете способ создавать распределённые, высокопроизводительные и отказоустойчивые приложения на платформе .NET, то Akka.NET — это инструмент, который стоит вашего внимания!
Что такое Akka.NET?
Akka.NET — это фреймворк, основанный на модели акторов (Actor Model). Он позволяет разработчикам легко работать с конкурентностью, параллелизмом и асинхронностью, избегая головной боли от многопоточности. Каждый «актор»" — это небольшая изолированная сущность, которая взаимодействует с другими через обмен сообщениями.
Почему Akka.NET?
🔄 Отказоустойчивость: приложение не упадёт из-за сбоя — акторы можно перезапустить или перенести.
📡 Распределённость: стройте приложения, которые работают на нескольких серверах или в облаке.
⚡️ Масштабируемость: akka.NET легко справляется с нагрузкой, увеличиваясь вместе с вашими задачами.
🛠 Интеграция с .NET: используйте привычный C# и экосистему .NET для построения сложных систем.
Чат-приложения: реальное время, тысячи пользователей.
Игровые серверы: управление игроками и состоянием мира.
Финансовые системы: обработка тысяч транзакций в секунду.
IoT: обработка данных от огромного числа устройств.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
C# давно стал ключевым инструментом для создания корпоративных приложений, сложных API и облачных решений. В мире .NET задачи на LeetCode могут показаться странной тренировкой: вместо проектирования архитектуры вы решаете головоломки. Но так ли они бесполезны? Или в этом есть скрытая выгода?
Давайте разберемся, как алгоритмы и структуры данных соотносятся с реальной разработкой на C#.
❓Почему LeetCode может быть полезным инструментом для C#-разработчиков?
Практически каждая задача на LeetCode заставляет вас работать с массивами, списками и словарями – ключевыми инструментами C#. С помощью этих задач вы научитесь писать лаконичный и оптимальный код, использующий силу LINQ.
Решение задач на платформах вроде LeetCode требует строгого подхода: минимизации сложности, оптимизации потребления памяти и написания понятного кода.
Собеседования на позиции C#-разработчика в крупных компаниях, таких как Microsoft или Amazon, часто включают задачи на алгоритмы и структуры данных.
➖ Слишком далеко от реальных задач
В реальном мире вы скорее будете настраивать ASP.NET, работать с базами данных через Entity Framework или строить архитектуру приложений, а не искать кратчайший путь в графе.
➖ Недостаток контекста экосистемы .NET
Практика на LeetCode практически не затрагивает таких аспектов, как разработка облачных решений на Azure, работа с Blazor или настройка CI/CD.
➖ Риск упущенных возможностей
Вместо того чтобы часами разбираться с задачей на динамическое программирование, вы могли бы потратить это время на изучение новых возможностей языка, таких как record-типы, async/await или паттерн-матчинг.
Please open Telegram to view this post
VIEW IN TELEGRAM
В C# потоки управляются через класс Thread из пространства имен System.Threading. Поток проходит несколько этапов на протяжении своего жизненного цикла. Давайте разберём эти этапы.
Поток создан, но ещё не запущен. Он находится в этом состоянии сразу после инициализации объекта Thread, но до вызова метода Start().
Thread thread = new Thread(MyMethod);
// Поток создан, но не запущен
Поток начинает выполнение после вызова Start(). В этом состоянии поток выполняет код, переданный в качестве делегата.
thread.Start();
// Поток запущен и выполняется
Поток приостанавливается, ожидая выполнения какого-либо условия или ресурса. Это может быть вызвано методами:
Thread.Sleep() — поток "засыпает" на заданное время.
Monitor.Wait() или lock — поток ожидает захвата монитора.
Thread.Join() — поток ожидает завершения другого потока.
Thread.Sleep(1000);
// Поток приостановлен на 1 секунду
Поток заблокирован, пытаясь получить доступ к ресурсу, уже занятому другим потоком. Например, ожидание захвата блокировки через lock.
Поток завершает выполнение. Это состояние наступает, когда метод, выполняемый в потоке, завершает работу или вызывается метод Abort() (устарел и не рекомендуется использовать). Поток в этом состоянии больше нельзя запустить снова.
thread.Join();
// Основной поток ожидает завершения
Дополнительные состояния
Поток может быть фоновым, если свойство IsBackground установлено в true. Фоновые потоки завершаются автоматически, когда завершается основной поток приложения.
thread.IsBackground = true;
// Устанавливаем поток как фоновый
Метод Suspend() приостанавливал выполнение потока, но был удалён из новых версий .NET из-за возможных проблем с безопасностью.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Pattern-matching — это функциональность языка, позволяющая проверять объект на соответствие определённому шаблону и выполнять действия, если объект удовлетворяет этим условиям. Этот механизм помогает писать более читабельный и компактный код, устраняя необходимость в громоздких конструкциях вроде if-else или switch.
Паттерн-матчинг в C# активно развивается с каждой новой версией языка и поддерживает множество типов паттернов, таких как:
1️⃣ Проверка типа
Используется для проверки типа объекта и его преобразования в этом же выражении.
2️⃣ Константные паттерны
Проверяет значение переменной на соответствие константе.
3️⃣ Реляционные и логические паттерны
Сравнивает значения и комбинирует паттерны с помощью логических операторов (and, or, not).
4️⃣ Паттерны в выражении switch
Улучшает конструкцию switch, позволяя использовать сложные условия.
5️⃣ Свойственные паттерны
Позволяют проверять свойства объекта.
6️⃣ Список и позиционные паттерны
Используются для проверки списков и кортежей.
🐸 Библиотека шарписта
Паттерн-матчинг в C# активно развивается с каждой новой версией языка и поддерживает множество типов паттернов, таких как:
Используется для проверки типа объекта и его преобразования в этом же выражении.
object obj = "Hello, world!";
if (obj is string str)
{
Console.WriteLine($"Длина строки: {str.Length}");
}
Проверяет значение переменной на соответствие константе.
int number = 42;
if (number is 42)
{
Console.WriteLine("Число равно 42");
}
Сравнивает значения и комбинирует паттерны с помощью логических операторов (and, or, not).
int age = 25;
if (age is > 18 and < 30)
{
Console.WriteLine("Возраст в диапазоне от 18 до 30");
}
Улучшает конструкцию switch, позволяя использовать сложные условия.
object shape = new Circle { Radius = 5 };
string description = shape switch
{
Circle { Radius: > 0 } c => $"Круг с радиусом {c.Radius}",
Rectangle { Width: > 0, Height: > 0 } r => $"Прямоугольник {r.Width}x{r.Height}",
_ => "Неизвестная форма"
};
Позволяют проверять свойства объекта.
Person person = new Person { Name = "Alice", Age = 30 };
if (person is { Name: "Alice", Age: > 25 })
{
Console.WriteLine("Это Алиса старше 25 лет");
}
Используются для проверки списков и кортежей.
int[] numbers = { 1, 2, 3 };
if (numbers is [1, 2, 3])
{
Console.WriteLine("Массив содержит 1, 2, 3");
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❗Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
job.proglib.io
Вакансии в медиа «Библиотека программиста»
Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
Открытая редакция: ищем авторов для рубрики DevLife
Друзья, нас часто спрашивают про публикацию материалов о личном опыте и знаниях в IT. Пора это систематизировать!
Если у вас есть история о том, как вы:
• выросли в профессии
• освоили новые технологии
• сделали крутой карьерный скачок
• эпично лажанулись
• создали интересные проекты
— присылайте свои статьи на почту hello@proglib.io с темой DevLife
Требования простые:
• Реальный опыт
• Конкретные шаги
• От 5000 знаков
• Ссылка на Google Docs
Лучшие истории опубликуем на сайте и в наших соцсетях с общим охватом 1 млн + человек.
Друзья, нас часто спрашивают про публикацию материалов о личном опыте и знаниях в IT. Пора это систематизировать!
Если у вас есть история о том, как вы:
• выросли в профессии
• освоили новые технологии
• сделали крутой карьерный скачок
• эпично лажанулись
• создали интересные проекты
— присылайте свои статьи на почту hello@proglib.io с темой DevLife
Требования простые:
• Реальный опыт
• Конкретные шаги
• От 5000 знаков
• Ссылка на Google Docs
Лучшие истории опубликуем на сайте и в наших соцсетях с общим охватом 1 млн + человек.
Когда вы работаете с switch или проверяете объекты через is, не забывайте про символ _. Это универсальный паттерн, который подходит для любого значения. Например, в switch он удобно используется для обработки случаев «по умолчанию»:
string DescribeDay(string day) => day switch
{
"Monday" => "Начало недели",
"Friday" => "Пятница, ура!",
_ => "Обычный день" // Все остальные случаи
};
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
HttpClient — это часто неочевидная область, где мелкие ошибки могут обернуться большими проблемами, такими как утечки ресурсов, игнорирование изменений DNS или перегрузка сети. Вот несколько ключевых уроков, которые помогут вам эффективно управлять HTTP-запросами в ваших приложениях.
Каждый раз, когда вы создаёте новый экземпляр HttpClient, в операционной системе открывается новый TCP-сокет. Если вы забыли правильно утилизировать его (или создаёте их слишком много за короткий промежуток времени), это может привести к исчерпанию доступных портов и замедлению работы приложения.
Вместо создания HttpClient вручную, внедряйте фабрику IHttpClientFactory. Она решает проблемы утечки сокетов, управляет временем жизни клиентов и правильно обрабатывает изменения DNS.
Сетевые запросы могут иногда прерываться. Настройте стратегию повторных попыток через библиотеку Polly, к примеру.
services.AddHttpClient("RetryClient")
.AddTransientHttpErrorPolicy(policy =>
policy.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));
Please open Telegram to view this post
VIEW IN TELEGRAM
Метод FirstOrDefault в LINQ может стать источником путаницы. Он возвращает первый элемент последовательности или значение по умолчанию для типа, если элементов нет. Для ссылочных типов и Nullable<T> это null, а для значимых типов (например, int) — это их дефолтное значение (0, false и т.д.).
✏️ Например, вызов FirstOrDefault для пустого списка List<int> вернёт 0, что может быть неожиданно, если 0 имеет смысловое значение в вашем коде.
var numbers = new List<int> { };
var result = numbers.FirstOrDefault();
Console.WriteLine(result); // Вывод: 0
❗️Чтобы избежать ошибок, рекомендуется явно проверять коллекцию на пустоту перед вызовом метода или использовать DefaultIfEmpty, чтобы задать своё значение по умолчанию. Например:
var result = numbers.DefaultIfEmpty(null).FirstOrDefault();
Это гарантирует, что даже для пустой коллекции результат будет null, а не дефолтное значение типа. Такой подход делает код понятным и избавляет от скрытых проблем с обработкой "пустых" результатов.
#tip
Please open Telegram to view this post
VIEW IN TELEGRAM