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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
😍 Сериализация и 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
👍12❤‍🔥4
⚙️ nameof теперь понимает несвязанные обобщения

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

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


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

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

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


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

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱31👾2👍1
🤩 Модификаторы параметров в лямбдах

С# 14 упрощает определение лямбда-выражений с модификаторами, без лишних повторений.

Теперь можно использовать ref, out, in и другие модификаторы в параметрах лямбд без обязательного указания типа:
delegate bool TryParse<T>(string text, out T result);
TryParse<int> parse = (text, out result) => int.TryParse(text, out result);


Ранее можно было добавлять модификаторы к параметрам лямбда-выражений только при условии, что для всех параметров явно указывались типы.

🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👏6
⚡️ Директивы #warnon и #nowarn в F#

В предыдущих версиях F# часто возникала проблема — как избавиться от мешающих предупреждений без потери важной информации по всему файлу.

С выходом F# 10 в язык добавлены новые директивы #warnon и #nowarn, которые позволяют точно управлять уровнем сообщений о предупреждениях внутри конкретных участков кода.

Что такое #warnon и #nowarn

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

Как это работает на практике:
#nowarn 25

let f (Some a) =
// тут предупреждение FS0025 отключено
...

#warnon 25
// здесь предупреждение активировано снова


Теперь предупреждение FS0025 отключено только в этом участке и не влияет на остальной код.

🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
⭐️ Пост-квантовая криптография в .NET 10

релизе .NET 10 Microsoft активно внедряет поддержку алгоритмов PQC, чтобы обеспечить будущее безопасных приложений уже сегодня.

Термин «пост» в PQC не означает, что квантовые компьютеры уже здесь. Это про алгоритмы, которые будут устойчивы к атакам со стороны мощных квантовых вычислительных систем, которые могут создать угрозу традиционным методам шифрования, таким как RSA и ECC.

В .NET 10 представлены четыре ключевых алгоритма PQC с поддержкой стандартов NIST и IETF:

• ML-KEM — алгоритм для захвата ключа, поддерживаемый NIST FIPS 203, класс MLKem в .NET

• ML-DSA — алгоритм цифровой подписи, поддерживаемый NIST FIPS 204, класс MLDsa в .NET

• SLH-DSA — алгоритм цифровой подписи, поддерживаемый NIST FIPS 205, класс SlhDsa в .NET

• Composite ML-DSA — композитный алгоритм цифровой подписи, поддерживаемый IETF Draft, класс CompositeMLDsa в .NET

Переход на PQC заставил переосмыслить архитектуру криптографических классов. Старый базовый класс AsymmetricAlgorithm не соответствовал современным требованиям, например, свойство KeySize стало менее уместным для новых алгоритмов.

🔹 Экспресс-курс «Математика для Data Science»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
6
😊 Модернизация .NET приложений с GitHub Copilot

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

С GitHub Copilot модернизация стала проще и быстрее — этот инструмент помогает автоматизировать всё главное, сокращая время работы с недель до нескольких часов.

Как начать модернизацию

1. Откройте проект или решение в Visual Studio

2. Запустите агент-сессию: через контекстное меню Modernize или в GitHub Copilot Chat используя команду @modernize

3. Выберите путь модернизации: обновление версии .NET, миграция в Azure или другие опции

4. Проведите оценку и спланируйте

• Copilot анализирует код и зависимости
• Задаёт вопросы для настройки плана под ваши цели
• Генерирует Markdown-план модернизации для согласования и редактирования

Как проходит обновление

• После утверждения плана Copilot обновляет файлы, корректирует импорты и синтаксис автоматически

• Циклично исправляет ошибки сборки и запускает тесты для обеспечения стабильности

• Каждый крупный шаг фиксируется в Git с возможностью отката

• В случае сложных проблем, Copilot останавливается и запрашивает ваш ввод

➡️ Источник

🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚32
🧑‍💻 Новые возможности модификаторов доступа на авто-свойствах в F# 10

До F# 10, чтобы создать свойство с публичным геттером и приватным сеттером, приходилось писать много кода с явным объявлением полей и методов. Теперь это стало проще — можно задавать разные уровни доступа прямо на авто-свойствах.

Раньше подобное требовало большого количества шаблонного кода:
type Ledger() =
[<DefaultValue>] val mutable private _Balance: decimal
member this.Balance with public get() = this._Balance and private set v = this._Balance <- v


В F# 10 достаточно написать:
type Ledger() =
member val Balance = 0m with public get, private set


Особенности

• Модификатор доступа можно назначить либо на всё свойство, либо отдельно на геттер или сеттер.

• В сигнатурах .fsi это пока не поддерживается, ограничения остаются

Теперь можно писать меньше шаблонного кода, сохраняя чёткое разграничение прав собственности.

🔹 ML для старта в Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱43👾1
✏️ Сокращаем код

Collection expressions — удобный синтаксис для создания и инициализации коллекций и массивов с помощью квадратных скобок и элементов, разделённых запятыми. Можно использовать spread-элементы (..) для вставки содержимого других коллекций внутрь новой.

Пример:
int[] odds = [1, 3, 5, 7];

string[] vowels = ["a", "e", "i", "o", "u"];
string[] consonants = ["b", "c", "d", "f"];
string[] alphabet = [..vowels, ..consonants, "y"];


С помощью выражений коллекций можно легко создавать массивы, списки, Span и другие коллекторные типы. Появились они в C# 12.

🔹 Экспресс-курс «Математика для Data Science»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤨 Как искусственный интеллект помогает писать тесты

Создание качественных модульных тестов — важный, но утомительный и затратный процесс. GitHub Copilot Testing для .NET упрощает эту задачу, автоматически генерируя, собирая и выполняя тесты прямо в вашем рабочем процессе.

Как начать использовать

1. Установите последнюю версию Visual Studio 2026 Insiders и получите лицензию GitHub Copilot

2. Включите функцию GitHub Copilot Testing через настройки (Tools > Options > GitHub > Copilot > Testing

3. Откройте проект или решение на C# и убедитесь, что оно успешно собирается

4. В чате Copilot напишите команду @Test #target, где #target — имя метода, класса, файла, проекта, решения или #changes для git diff

5. Copilot автоматически проанализирует код, создаст проект с тестами (если его нет), сгенерирует, соберёт и выполнит тесты.

Результаты отображаются в Test Explorer и в окне чата, где вы увидите статистику по числу тестов, изменениям в покрытии кода и рекомендации по устранению «тестируемых» пробелов.

🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁1🤩1
🛠 Структурные опциональные параметры в F# 10

В F# 10 появилась возможность использовать структурный тип ValueOption<'T> для опциональных параметров. Это позволяет избежать выделения памяти в куче.

Теперь, применяя атрибут [<Struct>], можно указать компилятору использовать ValueOption<'T> — структуру, которая хранится на стеке и не требует дополнительных аллокаций.

Раньше:
type X() =
static member M(?x: string) =
match x with
| Some v -> printfn "Some %s" v
| None -> printfn "None"


Теперь с F# 10:
type X() =
static member M([<Struct>] ?x: string) =
match x with
| ValueSome v -> printfn "ValueSome %s" v
| ValueNone -> printfn "ValueNone"


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

🔹 Экспресс-курс «Математика для Data Science»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
1
⭐️ Логирование исключений с помощью фильтров

Фильтры исключений позволяют выполнить код при срабатывании catch, но при этом не перехватывать исключение.

Пример:
try 
{
await work();
}
catch (Exception ex) when (Log(ex))
{
// этот блок не выполняется, так как Log возвращает false
}

static bool Log(Exception ex)
{
// логируем исключение
return false;
}


Метод Log вызывается один раз при исключении, логирует его и возвращает false, чтобы исключение продолжило всплывать дальше без перехвата.

🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔9😁41👾1
🤩 Типизированные вычислительные выражения в F# 10 без скобок

В F# 10 упростили синтаксис для аннотирования типов в вычислительных выражениях. Теперь можно добавлять типы в let!, use! и and! без необходимости использовать дополнительные скобки вокруг идентификаторов.

ньше для указания типа в вычислительном выражении приходилось писать так:
let! (x: int) = fetchValue()


Сейчас можно написать короче:
let! x: int = fetchValue()


Если вы часто работаете с async, task или другими вычислениями, это изменение вы оцените.

🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
1🤔1🥱1
👨‍💻 Обработка ошибок в .NET minimal API

При разработке API важно правильно и понятно передавать клиентам информацию о возникших ошибках.

Одним из удобных способов сделать это в .NET minimal API является использование встроенного метода Results.Problem. Он возвращает объект с подробностями ошибки в стандарте ProblemDetails, что упрощает клиентам обработку ответа.

Пример:
app.MapGet("/users/{id}", async (string id, IUserRepo repo) =>
{
if (!Guid.TryParse(id, out var guid))
return Results.Problem("Invalid id", statusCode: 400);

var user = await repo.Find(guid);
return user is null ? Results.NotFound() : Results.Ok(user);
});


В этом коде при неверном формате id возвращается ProblemDetails с кодом 400, если пользователь не найден — 404, иначе 200 с данными.

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM