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👍12🥱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
👍18❤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
😢6❤1👍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
👍6🥱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
👍13🔥5😁3❤2
Большинство кандидатов видят только популярные вакансии, а те, что скрыты, остаются незаметными из-за дефектов поиска и плохих фильтров. Булевые операторы помогают создавать точные запросы, которые учитывают и исключают нужные параметры.
Гитхаб и Google — дополнительные инструменты для охоты на вакансии, особенно стартапы, которые редко выкладывают открытые позиции на обычных сайтах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Управление данными в свойствах теперь проще с новым ключевым словом для доступа к автоматически созданному полю.
Раньше для добавления логики установки значения использовалось отдельное поле и аксессоры:
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
👍21❤2😁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
Anonymous Poll
20%
Мемы
17%
Пост про foreach
13%
Напоминания про .NET Conf
5%
Холивар про скриншоты
18%
Пост про сравнения у рекордов
19%
Про копирование с with
40%
Мини-обзор .NET 10
14%
Про два using'a
38%
Обновлённые расширения типов в C# 14
🥱17🔥2
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
👍25❤3🙏2
🚀 В IT ценится не перфекционизм, а движение вперёд, и если вы давно откладывали обучение — самое время начать.
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
😁3👍1
🛠 Натуральные преобразования для Span и ReadOnlySpan
C# 14 позволяет неявно преобразовывать между
Типы
🐸 Библиотека шарписта
#il_люминатор
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
🔥8❤2⚡1
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
Команда Microsoft обсуждает интеграцию Windows Edge Light в PowerToys. Это небольшая утилита для освещения лица во время видеоконференций, которая нужна, когда вокруг вас темно, а вебкамера плохо справляется с автоматическими настройками.
Сейчас Windows Edge Light работает как отдельное приложение: вы запускаете его перед видеозвонком, и оно подсвечивает лицо через экран вашего монитора. Инструмент простой, но продуманный — можно менять интенсивность света, использовать горячие клавиши для быстрого включения-отключения, удерживать окно поверх других приложений и даже кликать через него, не закрывая фокус на основном приложении.
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
🎓 Экспресс-курс «Математика для Data Science» стартует 4 декабря
Этот курс для вас, если вы:
🧑💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.
📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.
📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.
🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики
👉 Записаться на курс
Этот курс для вас, если вы:
🧑💻 Программист
Когда нужно понять, что происходит «под капотом» ML-алгоритмов.
📊 Начинающий DS / аналитик / студент
Чтобы закрыть теорию, подтянуть фундамент и собрать портфолио.
📈 Смежный специалист
Чтобы уверенно работать с моделями, статистикой и гипотезами.
🎁 Сейчас лучший момент стартовать:
— скидка 40% на курс до конца ноября
— можно пройти бесплатный тест на знание основ математики
👉 Записаться на курс
Удобство и гибкость метапрограммирования — теперь 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
🥱29👾2
This media is not supported in your browser
VIEW IN TELEGRAM
🥱17🌚2😁1👾1