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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
👍 Распаковка данных в одну строку

Records автоматически поддерживают деструкцию благодаря основному конструктору. Это позволяет распаковать свойства объекта прямо при присваивании.

Вместо того чтобы обращаться к каждому свойству отдельно:
public record Point(int X, int Y);

var point = new Point(15, 20);
int x = point.X;
int y = point.Y;


Просто распакуйте:
var (x, y) = new Point(15, 20);
Console.WriteLine($"Координаты: {x}, {y}");


Это особенно удобно в сочетании с pattern matching и switch выражениями:
public record User(string Name, int Age);

if (new User("Боб", 25) is { Age: > 18 })
Console.WriteLine("Взрослый пользователь");

var (name, age) = new User("Алиса", 30);


Вместо трёх строк получаете одну строку и респект от коллег не факт.

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
😢61👍1
🆚 Лаконичный стиль или привычный блок

В C# есть конструкция using, которая помогает правильно освобождать ресурсы. Но выглядеть она может по-разному, и сейчас можно выбрать, какой стиль использовать.

Старый добрый способ с блоком:
using (var connection = new SqlConnection(connString))
{
connection.Open();
// Сюда кладём код работы с ресурсом
} // Dispose вызывается автоматически при выходе из блока


Чётко, понятно, но возникают лишние скобки и с отступами порой становится сложнее. Особенно, если таких блоков много.

А теперь взгляд современного разработчика:
using var connection = new SqlConnection(connString);
connection.Open();
// Здесь код с использованием ресурса
// Dispose вызовется автоматически при выходе из области видимости метода


Минимализм, читаемость, меньше шума. Но важно помнить, что Dispose произойдёт в конце метода, а не сразу после строки.

💬 Что выбираете вы? Старый стиль с блоками или лаконичный using?

🐸Библиотека шарписта

#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🥱2
📘 Хочешь в Data Science, но есть пробелы в знаниях математики?

Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀

Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.

🔥 Не упусти халяву: сейчас 40% до 30 ноября

👉 Записаться на курс
Расширяем типы по-новому

В C# 14 расширяется концепция расширений: можно создавать не только расширенные методы для экземпляров типов, но и свойства расширения, а также расширения, которые относятся к самому типу как к статическому элементу.

Пример:
public static class EnumerableExtensions
{
extension<TSource>(IEnumerable<TSource> source)
{
public bool IsEmpty => !source.Any(); // Расширенное свойство
}

extension<TSource>(IEnumerable<TSource>)
{
public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second)
=> first.Concat(second); // Статический метод расширения
}
}


Конструкция extension<TSource>(IEnumerable<TSource> source) — это новый синтаксис блока расширения для экземпляра типа: здесь определяются расширяющие члены, которые «прикрепляются» к объекту IEnumerable<TSource>.
Внутри блока объявлено свойство IsEmpty, которое возвращает true, если последовательность пуста (!source.Any()).

Второй блок extension<TSource>(IEnumerable<TSource>) — расширение для самого типа IEnumerable<TSource> как статического члена.
Внутри него определён статический метод Combine, который принимает две последовательности и объединяет их с помощью Concat.

Как это использовать:
var list = new List<int> { 1, 2, 3 };

bool empty = list.IsEmpty; // false — вызов расширенного свойства как у экземпляра

var combined = Enumerable<int>.Combine(new[] { 1 }, new[] { 2, 3 }); // {1, 2, 3}


🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥5😁32
🔍 Как увидеть вакансии, которые потерялись в ленте LinkedIn и других сайтов

Большинство кандидатов видят только популярные вакансии, а те, что скрыты, остаются незаметными из-за дефектов поиска и плохих фильтров. Булевые операторы помогают создавать точные запросы, которые учитывают и исключают нужные параметры.

Гитхаб и Google — дополнительные инструменты для охоты на вакансии, особенно стартапы, которые редко выкладывают открытые позиции на обычных сайтах.

➡️ Найдите вакансии, которые скрыты от других

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Ключевое слово field упрощает свойства

Управление данными в свойствах теперь проще с новым ключевым словом для доступа к автоматически созданному полю.

Раньше для добавления логики установки значения использовалось отдельное поле и аксессоры:
private string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}


Сейчас field ссылается на поле, которое создает компилятор, сокращая код:
public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}


Минимум кода — максимум контроля: write-only свойства снаружи и строгая логика внутри.

🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍212😁2
⭐️ Дайджест недели

Неделю взяли Microsoft со своей конференцией и обновлениями.

— .NET Conf. День 1 и день 2

Doom теперь в Telegram

Юбилейный .NET

Обновления .NET и .NET Framework

В ноябрьском обновлении 2025 года вышли новые релизы .NET 8.0.22 и .NET 9.0.11, включающие набор технических исправлений.

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Pattern matching как в функциональных языках

Records идеально сочетаются с pattern matching. Вы получаете алгебраические типы данных, которые раньше были только в функциональных языках вроде F#.

Представьте, что вам нужно рассчитать площадь разных фигур:
public abstract record Shape;
public record Circle(double Radius) : Shape;
public record Rectangle(double Width, double Height) : Shape;

double CalculateArea(Shape shape) => shape switch
{
Circle(var r) => Math.PI * r * r,
Rectangle(var w, var h) => w * h,
_ => throw new ArgumentException("Неизвестная фигура")
};


Никаких is checks, никаких кастов, никакого боксинга. Компилятор знает структуру и гарантирует полноту проверки всех случаев.

Можете комбинировать с проверками свойств:
if (shape is Rectangle { Width: > 100, Height: > 100 })
Console.WriteLine("Большой прямоугольник");


Это делает бизнес-логику выразительнее и безопаснее. Вместо цепочки if-else с кастами получаете элегантный switch:
public abstract record OrderStatus;
public record Pending : OrderStatus;
public record Shipped(DateTime Date) : OrderStatus;
public record Cancelled(string Reason) : OrderStatus;

string Describe(OrderStatus status) => status switch
{
Pending => "Ожидает отправки",
Shipped(var date) => $"Отправлен {date:d}",
Cancelled(var reason) => $"Отменён: {reason}",
};


🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍253🙏2
🚀 В IT ценится не перфекционизм, а движение вперёд, и если вы давно откладывали обучение — самое время начать.

❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!

Что нужно:

⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.

🎓 Курсы, которые участвуют

👉 Участвовать
😁3👍1
💬 На чьей стороне вы

🐸Библиотека шарписта

#garbage_collector
Please open Telegram to view this post
VIEW IN TELEGRAM
😁34👾12🥱4
🛠 Натуральные преобразования для Span и ReadOnlySpan

C# 14 позволяет неявно преобразовывать между Span<T>, ReadOnlySpan<T> и массивами, упрощая манипуляции с данными и повышая скорость:
ReadOnlySpan<char> roSpan = "hello";
Span<char> span = roSpan;
char[] array = roSpan.ToArray();


Типы Span теперь могут выступать как принимающие методы расширения, то есть станут получателями вызова таких методов. Они также могут комбинироваться с другими типами преобразований.

🐸Библиотека шарписта

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥821
😍 Сериализация и API контракты по умолчанию

Records созданы для API контрактов и DTO. System.Text.Json работает с ними без дополнительных конфигураций — просто как есть.

public record WeatherData(string City, decimal Temperature, string Condition);

var data = new WeatherData("Москва", 15.5M, "Облачно");
var json = JsonSerializer.Serialize(data);
Console.WriteLine(json);
// {"City":"Москва","Temperature":15.5,"Condition":"Облачно"}

var deserialized = JsonSerializer.Deserialize<WeatherData>(json);


Ни лишних конструкторов, ни public setters, ни аннотаций. Десериализация понимает init-only свойства и positional параметры. Это делает API слой минималистичным и надёжным.

Работает и с Newtonsoft.Json, и с gRPC. Records — это естественный способ определения контрактов между системами.

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤‍🔥3
💡 PowerToys может получить Windows Edge Light

Команда Microsoft обсуждает интеграцию Windows Edge Light в PowerToys. Это небольшая утилита для освещения лица во время видеоконференций, которая нужна, когда вокруг вас темно, а вебкамера плохо справляется с автоматическими настройками.

Сейчас Windows Edge Light работает как отдельное приложение: вы запускаете его перед видеозвонком, и оно подсвечивает лицо через экран вашего монитора. Инструмент простой, но продуманный — можно менять интенсивность света, использовать горячие клавиши для быстрого включения-отключения, удерживать окно поверх других приложений и даже кликать через него, не закрывая фокус на основном приложении.

➡️ Новость

➡️ Репозиторий Windows Edge Light

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
🎓 Экспресс-курс «Математика для Data Science» стартует 4 декабря

Этот курс для вас, если вы:

🧑‍💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.

📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.

📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.

🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики

👉 Записаться на курс
⚙️ nameof теперь понимает несвязанные обобщения

Удобство и гибкость метапрограммирования — теперь nameof работает для обобщений без аргументов.

Благодаря новой поддержке можно получить имена обобщенных типов без указания параметров:
Console.WriteLine(nameof(List<>));  // Выведет "List"


🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥4😁1
⚡️ Быстрая фишка

Когда тип переменной явно указан, можно опускать его в инициализации с помощью target-typed new:
Dictionary<string, int> scores = new();


Вместо повторения полного типа справа, достаточно просто написать new(). Фича доступна с C# 9.

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱27👾2
This media is not supported in your browser
VIEW IN TELEGRAM
🥱17🌚2😁1👾1
😵‍💫 Усиль свои позиции на собесе в Data Science знаниями математики!

Чем важна математика расскажет Мария Тихонова - кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ на курсе «Математика для Data Science» от Proglib Academy.

👀 Мария - человек, который реально работает с LLM и делает так, чтобы модели понимали человеческую речь, а не делали вид.

📌 Добавь в свое портфолио проект, выделись среди конкурентов

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

Бонусы:
- скидка 40% до 30 ноября
- если оплатить до конца ноября, получите курс «Базовая математика» в подарок

➡️ Пройти бесплатный тест на знание математики

👇👇👇
Записаться на курс
Please open Telegram to view this post
VIEW IN TELEGRAM
🤓 Что нового в Git 2.52

В Git 2.52 появились полезные новинки для повседневной работы и поддержки больших репозиториев. Команда внедрила новую команду git last-modified, с помощью которой теперь можно быстро увидеть, какие коммиты последними изменяли каждый файл в папке.

Для тех, кто заботится о здоровье репозиториев, git maintenance получил новый режим geometric, который экономит время при репаках.

Ещё одна заметная особенность — экспериментальная команда git repo, которая помогает получать разную информацию о репозитории, например, сколько в нём веток или тегов.

➡️ Анонс обновления

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
Реактивное программирование в C# Advanced: сложные операторы, обработка ошибок и холодные/горячие Observable

Асинхронность в C# может быть простой, если знать, как с ней работать правильно. На открытом вебинаре курса OTUS C# Developer. Advanced Елена Сычева покажет, как реактивное программирование помогает избавиться от Callback Hell и писать код, который сам реагирует на данные и события.

26 ноября, 20:00
Реактивное программирование в C# Advanced
— продвинутые операторы Rx.NET: Switch, GroupBy, Buffer, Throttle
— устойчивые к сбоям системы: Catch, Retry, Finally
— холодные и горячие Observable: Publish, Replay, RefCount
— управление подписками и жизненным циклом реактивных компонентов
Вебинар будет полезен разработчикам на C#, работающим с асинхронным кодом, потоками данных и событиями. Участники узнают, как проектировать реактивные системы, способные восстанавливаться после ошибок, и писать декларативный, читаемый и эффективный код.

Зарегистрируйтесь: https://clc.to/U2plGA

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576