Библиотека шарписта | C#, F#, .NET, ASP.NET
23.3K subscribers
2.11K photos
32 videos
85 files
4.28K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
👋Привет, шарписты!

Мы ищем участников для интервью на тему «Обучение навыкам в IT»!

Кто нам нужен?
Вы недавно (в последние 6 месяцев) проходили курсы по техническим специальностям или математике.
Вы разработчик, стремящийся освоить Data Science или Machine Learning.

Что вас ждет?
Участие в интервью по Zoom, которое займет не больше 45 минут.📞
🤑 1500 рублей на карту за ваше время.
Уникальный шанс пообщаться с нашим CEO!😎

Как откликнуться?
✏️Напишите в личные сообщения @artem_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, приводит к повторному перебору коллекции.
Решение: кэшируйте результаты, если они используются несколько раз:
var filtered = myCollection.Where(x => x.Age > 30).ToList(); // Выполняется один раз
var count = filtered.Count;
var average = filtered.Average(x => x.Salary);


2️⃣Используйте ForEach вместо Select, если результат не нужен
Использование Select для выполнения действий без необходимости возвращать коллекцию увеличивает накладные расходы.
Решение: используйте ForEach для простого выполнения действий:
myCollection.ForEach(x => Console.WriteLine(x.Name));


3️⃣Избегайте использования Count для проверки на пустоту
Count перебирает всю коллекцию, что замедляет выполнение.
Решение: используйте Any() вместо Count():
if (myCollection.Any()) // Быстрее, чем myCollection.Count > 0


4️⃣Параллельное выполнение (PLINQ)

Обработка больших коллекций может быть медленной.
Решение: используйте PLINQ для параллельного выполнения:
var result = myCollection.AsParallel()
.Where(x => x.IsActive)
.ToList();


5️⃣Проекционная оптимизация (Select)
Извлечение всех данных, когда требуется только несколько полей.
Решение: Используйте Select для выборки только необходимых данных:
var names = myCollection.Select(x => x.Name).ToList();


6️⃣Фильтрация перед проекцией
Проекция больших объёмов данных перед фильтрацией замедляет запрос.
Решение: сначала фильтруйте, затем проецируйте:
var result = myCollection.Where(x => x.Age > 30)
.Select(x => x.Name)
.ToList();


🐸Библиотека шарписта
#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
🔒 Релиз .NET 9.0.1: основные исправления безопасности

Microsoft выпустила обновление .NET 9.0.1, которое в первую очередь сфокусировано на устранении уязвимостей.

Вот ключевые моменты:
Устранены уязвимости, позволяющие удалённое выполнение кода через специально сформированные файлы.
Исправлена проблема повышения привилегий на Linux.
Затронуты как .NET, так и Visual Studio.

🐸Библиотека шарписта
#новость
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻⚡️ Akka.NET: Ваш путь к созданию масштабируемых и надёжных приложений

Если вы ищете способ создавать распределённые, высокопроизводительные и отказоустойчивые приложения на платформе .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
👨‍💻Алгоритмы на LeetCode как способ усилить навыки

C# давно стал ключевым инструментом для создания корпоративных приложений, сложных API и облачных решений. В мире .NET задачи на LeetCode могут показаться странной тренировкой: вместо проектирования архитектуры вы решаете головоломки. Но так ли они бесполезны? Или в этом есть скрытая выгода?
Давайте разберемся, как алгоритмы и структуры данных соотносятся с реальной разработкой на C#.

Почему LeetCode может быть полезным инструментом для C#-разработчиков?

LINQ и коллекции: максимальная отдача от стандартной библиотеки
Практически каждая задача на LeetCode заставляет вас работать с массивами, списками и словарями – ключевыми инструментами C#. С помощью этих задач вы научитесь писать лаконичный и оптимальный код, использующий силу LINQ.

Фокус на чистоту и производительность кода
Решение задач на платформах вроде LeetCode требует строгого подхода: минимизации сложности, оптимизации потребления памяти и написания понятного кода.

Готовность к любым вызовам
Собеседования на позиции C#-разработчика в крупных компаниях, таких как Microsoft или Amazon, часто включают задачи на алгоритмы и структуры данных.

Почему LeetCode может быть не лучшей инвестицией времени?

Слишком далеко от реальных задач
В реальном мире вы скорее будете настраивать ASP.NET, работать с базами данных через Entity Framework или строить архитектуру приложений, а не искать кратчайший путь в графе.

Недостаток контекста экосистемы .NET
Практика на LeetCode практически не затрагивает таких аспектов, как разработка облачных решений на Azure, работа с Blazor или настройка CI/CD.

Риск упущенных возможностей
Вместо того чтобы часами разбираться с задачей на динамическое программирование, вы могли бы потратить это время на изучение новых возможностей языка, таких как record-типы, async/await или паттерн-матчинг.

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Жизненный цикл потока в C#

В C# потоки управляются через класс Thread из пространства имен System.Threading. Поток проходит несколько этапов на протяжении своего жизненного цикла. Давайте разберём эти этапы.

1️⃣Unstarted (Не запущен)
Поток создан, но ещё не запущен. Он находится в этом состоянии сразу после инициализации объекта Thread, но до вызова метода Start().
Thread thread = new Thread(MyMethod); 
// Поток создан, но не запущен


2️⃣Running (Выполняется)
Поток начинает выполнение после вызова Start(). В этом состоянии поток выполняет код, переданный в качестве делегата.

thread.Start(); 
// Поток запущен и выполняется


3️⃣Waiting (Ожидание)
Поток приостанавливается, ожидая выполнения какого-либо условия или ресурса. Это может быть вызвано методами:

Thread.Sleep() — поток "засыпает" на заданное время.
Monitor.Wait() или lock — поток ожидает захвата монитора.
Thread.Join() — поток ожидает завершения другого потока.
Thread.Sleep(1000); 
// Поток приостановлен на 1 секунду


4️⃣Blocked (Заблокирован)
Поток заблокирован, пытаясь получить доступ к ресурсу, уже занятому другим потоком. Например, ожидание захвата блокировки через lock.

5️⃣Stopped (Остановлен)
Поток завершает выполнение. Это состояние наступает, когда метод, выполняемый в потоке, завершает работу или вызывается метод Abort() (устарел и не рекомендуется использовать). Поток в этом состоянии больше нельзя запустить снова.
thread.Join(); 
// Основной поток ожидает завершения


Дополнительные состояния
Background (Фоновый поток):
Поток может быть фоновым, если свойство IsBackground установлено в true. Фоновые потоки завершаются автоматически, когда завершается основной поток приложения.
thread.IsBackground = true; 
// Устанавливаем поток как фоновый


Suspended (Приостановлен, устарело):
Метод Suspend() приостанавливал выполнение потока, но был удалён из новых версий .NET из-за возможных проблем с безопасностью.

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
Pattern-matching — это функциональность языка, позволяющая проверять объект на соответствие определённому шаблону и выполнять действия, если объект удовлетворяет этим условиям. Этот механизм помогает писать более читабельный и компактный код, устраняя необходимость в громоздких конструкциях вроде if-else или switch.

Паттерн-матчинг в C# активно развивается с каждой новой версией языка и поддерживает множество типов паттернов, таких как:

1️⃣ Проверка типа
Используется для проверки типа объекта и его преобразования в этом же выражении.
object obj = "Hello, world!";
if (obj is string str)
{
Console.WriteLine($"Длина строки: {str.Length}");
}


2️⃣ Константные паттерны
Проверяет значение переменной на соответствие константе.
int number = 42;
if (number is 42)
{
Console.WriteLine("Число равно 42");
}


3️⃣ Реляционные и логические паттерны
Сравнивает значения и комбинирует паттерны с помощью логических операторов (and, or, not).
int age = 25;
if (age is > 18 and < 30)
{
Console.WriteLine("Возраст в диапазоне от 18 до 30");
}


4️⃣ Паттерны в выражении switch
Улучшает конструкцию 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}",
_ => "Неизвестная форма"
};



5️⃣ Свойственные паттерны
Позволяют проверять свойства объекта.
Person person = new Person { Name = "Alice", Age = 30 };

if (person is { Name: "Alice", Age: > 25 })
{
Console.WriteLine("Это Алиса старше 25 лет");
}


6️⃣ Список и позиционные паттерны
Используются для проверки списков и кортежей.
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
Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
Открытая редакция: ищем авторов для рубрики DevLife

Друзья, нас часто спрашивают про публикацию материалов о личном опыте и знаниях в 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
💡Лучшие практики работы с HttpClient в C#

HttpClient — это часто неочевидная область, где мелкие ошибки могут обернуться большими проблемами, такими как утечки ресурсов, игнорирование изменений DNS или перегрузка сети. Вот несколько ключевых уроков, которые помогут вам эффективно управлять HTTP-запросами в ваших приложениях.

1️⃣ Никогда не создавайте HttpClient в цикле
Каждый раз, когда вы создаёте новый экземпляр HttpClient, в операционной системе открывается новый TCP-сокет. Если вы забыли правильно утилизировать его (или создаёте их слишком много за короткий промежуток времени), это может привести к исчерпанию доступных портов и замедлению работы приложения.

2️⃣ Используйте IHttpClientFactory
Вместо создания HttpClient вручную, внедряйте фабрику IHttpClientFactory. Она решает проблемы утечки сокетов, управляет временем жизни клиентов и правильно обрабатывает изменения DNS.

3️⃣ Используйте политику повторных попыток
Сетевые запросы могут иногда прерываться. Настройте стратегию повторных попыток через библиотеку Polly, к примеру.
services.AddHttpClient("RetryClient")
.AddTransientHttpErrorPolicy(policy =>
policy.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));


📎Если вы хотите погрузиться глубже, разобраться с именованными и типизированными клиентами, управлением DNS и правильной утилизацией, то рекомендуем статью к прочтению

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🤨 Неочевидная проблема FirstOrDefault

Метод 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