Anonymous Poll
45%
Каналы и фоновые сервисы для долгих операций
18%
Задача про квадратный корень
15%
Видео про управление доступом
23%
Базовые cli-команды .NET
19%
Demystifier
15%
Новость про роадмапу
18%
Генератор lorem ipsum'ов
53%
IOptions и компания
🥱1
💻 ВАЖНО: макбук ещё не забрали!
Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).
Что нужно для участия?
— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (можно за два дня ).
— Пишешь куратору #розыгрыш. Всё — ты в игре!
Что за курсы?
▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.
▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.
▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.
👉 Влетай, не думай!
Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).
Что нужно для участия?
— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (
— Пишешь куратору #розыгрыш. Всё — ты в игре!
Что за курсы?
▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.
▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.
▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.
👉 Влетай, не думай!
😁4🥱1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁26🌚4🥱3🤔2👾2
В Telegram появился порт классической игры Doom, а также Doom II, который теперь запускается прямо внутри WebView виджета.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👾6😁4
В C# цикл foreach часто воспринимается как самая удобная и красивая форма для обхода коллекций. Но в вопросах производительности
foreach не всегда оптимален.Почему лучше избегать
foreach:•
foreach использует итератор — для массивов его оптимизируют, но для списков, словарей и других коллекций создаётся объект или struct-итератор.• под капотом
foreach может создавать временные объекты, что увеличивает нагрузку на сборщик мусора и снижает производительность.•
foreach всегда выполняет проверки и гарантирует корректность обхода, но это стоит некоторой производительности.Что использовать вместо foreach:
Цикл for с индексом, особенно для массивов:
for (int i = 0; i < data.Length; i++)
{
// работа с data[i]
}
Span<T> и его методы — для обхода данных без выделения памяти и избыточных проверок:var span = data.AsSpan();
for (int i = 0; i < span.Length; i++)
{
// работа с span[i]
}
Когда можно использовать
foreach:• Если цикл выполняется нечасто или количество элементов небольшое.
• Для обхода коллекций, где критичен чистый и понятный стиль программирования.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔15❤4🥱1
💻 Хочешь MacBook Pro? Просто начни учиться!
Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!
Всё просто:
— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (можно за два дня );
— напиши куратору в чате курса хэштег #розыгрыш.
📚 Выбирай свой курс:
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
👉 Участвовать в розыгрыше
Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!
Всё просто:
— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (
— напиши куратору в чате курса хэштег #розыгрыш.
📚 Выбирай свой курс:
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
👉 Участвовать в розыгрыше
😁2👍1
Records — это ссылочный тип, который упростил жизнь разработчикам, привыкшим писать иммутабельные классы вручную. Вот зачем они нужны.
Раньше иммутабельный класс требовал много кода: readonly свойства, отключённые сеттеры, кастомные конструкторы. И всё равно где-то находилась лазейка. С Records это просто исчезает:
public record User(string Name, string Email);
var user = new User("Алексей", "alex@example.com");
// user.Name = "Новое имя"; — Ошибка компиляции
Все свойства автоматически получают init-accessor. Установить значение можно только при создании объекта. Это не просто синтаксический сахар — это гарантия от багов состояния, которые трудно найти.
Если вам нужен объект инициализатор, Records это поддерживают:
public record Product
{
public string Name { get; init; }
public decimal Price { get; init; }
}
var book = new Product { Name = "C# Deep Dive", Price = 49.99M };
Проще тестировать, проще рассуждать о коде, проще избежать багов в многопоточной среде. А ошибки, связанные с неожиданным изменением состояния, просто перестают существовать.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🥱6❤5
Сегодня начинается 15-я ежегодная виртуальная конференция .NET Conf 2025.
В первый день будут доклады по C# 14, производительности .NET 10, обновлениям Blazor, фреймворку Aspire, Agentic Development и .NET MAUI. Второй день посвящён облачной разработке с Azure, интеграциям Remote MCP серверов, Redis, расширениям Aspire и новому фреймворку тестирования Microsoft.Testing.Platform
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🛒 Black Friday от Proglib.academy!
Только до 30 ноября — скидка 40% на ВСЕ курсы.
Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.
🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.
👉 Учиться со скидкой
Только до 30 ноября — скидка 40% на ВСЕ курсы.
Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.
🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.
👉 Учиться со скидкой
💻 Скриншоты текста — зло для разработчиков
Когда видишь скриншот с кодом или ошибкой, хочется плакать — приходится вручную переписывать, тратить время и допускать ошибки. Почему бы просто не вставить текст? Отказ от удобств в угоду ленью — плохой тренд.
💬 Пробовали ли вы объяснять коллегам, почему скриншоты текста — это неудобно? Есть ли похожий опыт? Делитесь болью в комментах 👇
🐸 Библиотека шарписта
#entry_point
Когда видишь скриншот с кодом или ошибкой, хочется плакать — приходится вручную переписывать, тратить время и допускать ошибки. Почему бы просто не вставить текст? Отказ от удобств в угоду ленью — плохой тренд.
#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5💯1
💻 Сравнение по значению автоматом
Вы знаете, что с классами сравнение — это боль? Два объекта с одинаковыми данными считаются разными, потому что сравнивается идентичность. Иначе работают Records:
Без переопределения Equals, без GetHashCode, без перегрузки оператора ==. Record сам сравнит все свойства и даст правильный результат.
В словарях, в списках, при проверке условий — везде это работает как вы интуитивно ожидаете. Не будет случайных багов, когда один экземпляр не равен другому из-за того, что вы забыли переопределить Equals.
Value-based семантика — это основа, на которой строятся остальные возможности Records.
🐸 Библиотека шарписта
#sharp_view
Вы знаете, что с классами сравнение — это боль? Два объекта с одинаковыми данными считаются разными, потому что сравнивается идентичность. Иначе работают Records:
public record Person(string FirstName, string LastName);
var p1 = new Person("Иван", "Иванов");
var p2 = new Person("Иван", "Иванов");
Console.WriteLine(p1 == p2); // true
Без переопределения Equals, без GetHashCode, без перегрузки оператора ==. Record сам сравнит все свойства и даст правильный результат.
В словарях, в списках, при проверке условий — везде это работает как вы интуитивно ожидаете. Не будет случайных багов, когда один экземпляр не равен другому из-за того, что вы забыли переопределить Equals.
var users = new HashSet<User>();
users.Add(new User("Мария", "maria@example.com"));
users.Contains(new User("Мария", "maria@example.com")); // true — работает!
Value-based семантика — это основа, на которой строятся остальные возможности Records.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
Скоро начнётся второй день .NET Conf 2025. Среди тем — использование Azure для разработки с контейнерами, Kubernetes, функциями и AI-сервисами, построение собственных интеграций с помощью Remote MCP серверов, а также интеграция Redis с .NET.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
💯32❤7😁6
Records поддерживают выражение with, которое создаёт изменённую копию объекта без изменения оригинала:
public record Person(string FirstName, string LastName);
var original = new Person("Анна", "Смирнова");
var updated = original with { LastName = "Петрова" };
Console.WriteLine(original.LastName); // Смирнова
Console.WriteLine(updated.LastName); // Петрова
Особенно полезно в event sourcing, CQRS или Redux-подобных архитектурах, где вы формируете новые состояния без мутации исходных данных:
public record Order(int Id, string Status);
var first = new Order(1, "Ожидает");
var second = first with { Status = "Обработан" };
var third = second with { Status = "Отправлен" };
// Все три состояния существуют независимо
Это гарантирует, что никаких побочных эффектов, никаких неожиданных изменений в другой части кода. История состояний становится явной.
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍11🥱4
Читать вакансии нужно внимательно, иначе можно не заметить, что под модными словосочетаниями скрываются нестандартные условия труда или неожиданные обязательства.
Например, если описана свобода выбора графика, это почти всегда значит, что появятся поздние звонки или потребуется работать когда угодно. Формулировки про перспективы развития часто переводятся на постоянную работу в режиме форсированного многозадачия, где на поддержку рассчитывать не придется.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔄 Что нового в .NET 10
Оптимизации JIT-компиляции и улучшенная генерация кода ускоряют работу приложений. Добавлена поддержка новых инструкций AVX10.2 и NativeAOT.
Появились новые API для криптографии с поддержкой пост-квантовых алгоритмов и расширенными возможностями по ML-DSA. Улучшена поддержка глобализации, сериализации, работы с числовыми данными и ZIP-файлами.
Добавлена поддержка WebSocketStream и TLS 1.3 для macOS, а также расширены возможности управления процессами Windows.
.NET 10 SDK позволяет создавать контейнерные образы нативно и предлагает улучшенную CLI с генерацией табуляционных сценариев. Новые инструменты SDK поддерживают разные платформы и расширяют возможности для devops и cloud-разработки.
Улучшения Blazor, OpenAPI, расширенная проверка форм и поддержка Passkey для Identity.
C# 14 получил новые возможности: доступ к backing fields в свойствах, улучшения в nameof для generic-типов, более гибкая работа с Span<T> в лямбдах, расширенные статические методы и операторы, а также новые частичные конструкторы и события.
F#, Visual Basic, .NET MAUI, EF Core, Windows Forms и WPF обновились с улучшениями производительности, юзабилити и новым функционалом.
➡️ Блог Microsoft
🐸 Библиотека шарписта
#async_news
Оптимизации JIT-компиляции и улучшенная генерация кода ускоряют работу приложений. Добавлена поддержка новых инструкций AVX10.2 и NativeAOT.
Появились новые API для криптографии с поддержкой пост-квантовых алгоритмов и расширенными возможностями по ML-DSA. Улучшена поддержка глобализации, сериализации, работы с числовыми данными и ZIP-файлами.
Добавлена поддержка WebSocketStream и TLS 1.3 для macOS, а также расширены возможности управления процессами Windows.
.NET 10 SDK позволяет создавать контейнерные образы нативно и предлагает улучшенную CLI с генерацией табуляционных сценариев. Новые инструменты SDK поддерживают разные платформы и расширяют возможности для devops и cloud-разработки.
Улучшения Blazor, OpenAPI, расширенная проверка форм и поддержка Passkey для Identity.
C# 14 получил новые возможности: доступ к backing fields в свойствах, улучшения в nameof для generic-типов, более гибкая работа с Span<T> в лямбдах, расширенные статические методы и операторы, а также новые частичные конструкторы и события.
F#, Visual Basic, .NET MAUI, EF Core, Windows Forms и WPF обновились с улучшениями производительности, юзабилити и новым функционалом.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤2🌚1
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
😢5👍1
🆚 Лаконичный стиль или привычный блок
В C# есть конструкция using, которая помогает правильно освобождать ресурсы. Но выглядеть она может по-разному, и сейчас можно выбрать, какой стиль использовать.
Старый добрый способ с блоком:
Чётко, понятно, но возникают лишние скобки и с отступами порой становится сложнее. Особенно, если таких блоков много.
А теперь взгляд современного разработчика:
Минимализм, читаемость, меньше шума. Но важно помнить, что Dispose произойдёт в конце метода, а не сразу после строки.
💬 Что выбираете вы? Старый стиль с блоками или лаконичный using?
🐸 Библиотека шарписта
#entry_point
В 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
👍2🥱2
📘 Хочешь в Data Science, но есть пробелы в знаниях математики?
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
Мы сделали экспресс-курс «Математика для 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
👍11😁2🔥1