Библиотека шарписта | 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
😴🛠 Паттерн «Состояние»

Паттерн «Состояние» — это поведенческий паттерн проектирования, который позволяет объекту изменять своё поведение в зависимости от текущего состояния. Он помогает избежать большого количества условных операторов и делает код более читаемым, гибким и модульным.

Когда использовать паттерн «Состояние»?
Когда у объекта есть несколько состояний, и его поведение зависит от текущего состояния.
Когда в коде слишком много if-else или switch-case, которые проверяют состояние объекта.
Когда требуется обеспечить легкое добавление новых состояний без изменения существующего кода.

Основные компоненты паттерна
Контекст: класс, который хранит текущее состояние и позволяет его изменять. Обычно предоставляет интерфейс для взаимодействия с клиентом.
Интерфейс состояния: абстрактный или интерфейсный класс, который определяет общие методы, характерные для всех состояний.
Конкретные состояния: реализации интерфейса состояния. Каждое состояние определяет свое поведение, соответствующее текущему состоянию.

Недостатки паттерна
Увеличение числа классов, так как каждое состояние требует отдельной реализации.
Может быть избыточным для простых сценариев.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️Fluent API в C#: Читаемый код и удобство разработки

Fluent API — это стиль проектирования интерфейсов, который позволяет вызывать методы цепочкой, улучшая читаемость и удобство работы с кодом. В C# этот подход особенно популярен в таких библиотеках, как Entity Framework, FluentValidation и других.

Пример Fluent API
Представим, что мы хотим создать систему для построения SQL-запросов. Сначала сравним два подхода:
Без Fluent API
QueryBuilder queryBuilder = new QueryBuilder();
queryBuilder.Select("name", "age");
queryBuilder.Where("age > 18");
queryBuilder.OrderBy("name");
string query = queryBuilder.Build();;


С Fluent API
string query = new QueryBuilder()
.Select("name", "age")
.Where("age > 18")
.OrderBy("name")
.Build();


Код с Fluent API выглядит как цепочка операций, что делает его более читаемым и похожим на естественный язык.

Преимущества Fluent API
Код выглядит как последовательность операций.
Удобно добавлять новые методы и расширять функциональность.
Все операции выполняются на одном объекте.

Недостатки Fluent API
При длинных цепочках вызовов сложнее отлаживать ошибки.
Неправильно спроектированное API может выглядеть громоздко.
Please open Telegram to view this post
VIEW IN 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