C# Portal | Программирование
13.3K subscribers
1.29K photos
131 videos
31 files
998 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Сотрудничество, реклама: @devmangx

Менеджер: @Spiral_Yuri

РКН: https://clck.ru/3FocB6
Download Telegram
Вот хороший пример использования перехватчиков EF:

— Отслеживание времени создания и изменения сущностей.

Через ChangeTracker можно проверить состояние сущности и заполнить соответствующие поля.

Если этот DbContext всегда используется в рамках HTTP-запроса, можно также передавать UserId.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾1
Как сохранять объекты-значения в EF?

Допустим, у сущности Apartment есть Address, который вы реализовали как объект-значение.

EF позволяет настроить его как owned type, принадлежащий этой сущности. В результате Apartment и Address будут храниться в одной таблице базы данных, что может повысить производительность.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🍾1
Проводник — это место, где проходит огромная часть повседневной работы в Windows.

Открытие папок. Переименование файлов. Переключение между локальными и облачными данными. Правый клик, чтобы перейти к следующему действию. Когда всё это работает медленно, зависает или перегружено лишними элементами — это сразу заметно.

В сегодняшней сборке Windows Insider Microsoft ускорила запуск Проводника, сократила количество зависаний и задержек, улучшила мелкие повседневные детали и переработала контекстное меню по правому клику — теперь оно проще, быстрее и лучше настраивается.

Подробнее:
https://blogs.windows.com/windows-insider/2026/08/17/improving-file-explorer-context-menu-faster-simpler-and-more-customizable/

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
3🤣1🍾1
Импортируете CSV в Postgres? Используйте COPY или \copy.

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

Что важно знать:

FORMAT csv
Включает стандартный разбор CSV: запятые, поля в кавычках и экранированные кавычки.

Список целевых столбцов
Порядок столбцов в CSV редко совпадает с таблицей. Всегда указывайте целевые столбцы в том порядке, в котором они идут в файле. Postgres сопоставляет их по позиции, а не по имени из заголовка CSV.

HEADER / HEADER n
Пропускает строки заголовка. Обычный HEADER пропускает первую строку. Ожидается, что Postgres 19 позволит передавать число, например HEADER 2, чтобы пропускать несколько начальных строк.

DEFAULT 'string'
Позволяет сопоставить специальную строку в CSV, например '__DEFAULT__', с выражением DEFAULT соответствующего столбца.

Неуказанные столбцы
Столбцы таблицы, которые не указаны в списке целевых столбцов, автоматически получают DEFAULT или NULL.

Лишние столбцы в CSV
Postgres выдаст ошибку, если в CSV больше полей, чем указано целевых столбцов. Обрежьте файл или сначала загрузите данные в более широкую промежуточную таблицу.

NULL-значения
В формате csv стандартным представлением NULL является пустая строка без кавычек. Это можно изменить через NULL 'string'.

Обработка ошибок через ON_ERROR и REJECT_LIMIT
Исторически COPY останавливался на первой ошибке преобразования. В новых версиях появились:

ON_ERROR ignore в Postgres 17 — пропускает некорректные строки и сообщает их количество
REJECT_LIMIT n в Postgres 18 — задаёт максимальное число плохих строк при ON_ERROR ignore, после которого импорт будет остановлен
ON_ERROR set_null в Postgres 19 — заменяет некорректное поле на NULL вместо того, чтобы отбрасывать всю строку

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1🍾1
Разработчик предложил официальную формальную семантику C# на Lean 4 — то есть основу, которая позволит строить машинно проверяемые доказательства для C#.

ИИ-агенты становятся очень хороши в написании кода — и очень хороши в том, чтобы его ломать.

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

И это уже становится практичным.

У Rust уже есть Aeneas → Lean. Microsoft Research использует его для формальной верификации SymCrypt. У Java и C тоже уже есть основа в формальной верификации.

C# не должен остаться позади.

ИИ может написать код.
ИИ может построить доказательство.
А детерминированное ядро проверки доказательств проверит, действительно ли это доказательство корректно.

Это совсем другая модель доверия по сравнению с

ИИ пишет код → ИИ проверяет код → надеемся, что оба оказались правы.

Предложение: https://github.com/dotnet/csharplang/discussions/10314

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🍾1
Андерс Хейлсберг — создатель TypeScript и C#. На подкасте его спросили о том, как переписывание компилятора на Go позволило ускорить TypeScript примерно в 10 раз, и о том, как ИИ уже влияет на разработку ПО.

В выпуске

• Как переписывание компилятора дало ускорение в 10 раз
• Почему выбрали Go, а не Rust
• Почему для миграции не использовали LLM
• Как ИИ повлияет на разработку ПО в будущем

https://www.youtube.com/watch?v=cywK3XYYJ2o

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾3
C# 14 позволяет объединить проверку на null и присваивание в одну строку.

Раньше нужно было писать так:

if (customer is not null)
{
customer.Order = GetCurrentOrder();
}


Теперь оператор ?. можно использовать слева от присваивания:

customer?.Order = GetCurrentOrder();


Поведение то же самое. Если customer равен null, GetCurrentOrder() даже не вызовется.

Ещё несколько нюансов:

— работает и с +=, -= и другими составными присваиваниями
— не работает с ++ и --
— поддерживаются и ?., и ?[] слева от присваивания

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🍾2
C# 14 позволяет массивам, Span<T> и ReadOnlySpan<T> автоматически преобразовываться друг в друга.

Span<T> и ReadOnlySpan<T> уже повсеместно используются в среде выполнения ради производительности без ущерба для безопасности. В C# 14 компилятор получил полноценную поддержку преобразований между ними и T[]:

void PrintFirst(ReadOnlySpan<int> values)
{
Console.WriteLine(values[0]);
}

int[] numbers = [10, 20, 30];
PrintFirst(numbers);


Массив int напрямую передаётся в параметр ReadOnlySpan<int> — никаких явных вызовов преобразования.

✔️ Преобразования работают между ReadOnlySpan<T>, Span<T> и T[]

✔️ Типы Span теперь могут выступать получателями методов расширения

✔️ Компилятору стало проще выводить обобщённые типы, когда массивы и Span используются вместе

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🍾1
Эти заметки — структурированное руководство по собеседованиям по проектированию систем.

Внутри разбираются как базовые подходы к System Design, так и конкретные архитектуры: веб-краулеры, системы уведомлений, платёжные платформы и другие типичные задачи с собеседований.

https://github.com/liquidslr/system-design-notes

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3🍾1
C# 14 позволяет хранить сигнатуру конструктора и его реализацию в двух разных файлах.

Частичные члены уже позволяли разделять методы между сгенерированным и написанным вручную кодом. В C# 14 такой же подход с объявлением и реализацией теперь распространяется на конструкторы и события.

Объявляющая часть, которая, скорее всего, находится в сгенерированном коде, содержит только сигнатуру:

public partial class Order
{
public partial Order(string id);
}


А реализующая часть в вашем собственном файле содержит тело конструктора:

public partial class Order
{
public partial Order(string id)
{
Id = id;
}

public string Id { get; }
}


✔️ Должно быть ровно одно объявление и ровно одна реализация — ни больше ни меньше

✔️ Только реализующая часть может содержать инициализатор : this() или : base()

✔️ Тот же принцип теперь работает и для событий — в реализующей части должны быть оба метода доступа add и remove

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾2
Как добавить проверки работоспособности в .NET?

AddHealthChecks — добавляет необходимые сервисы.

MapHealthChecks — создаёт конечную точку для проверки состояния приложения.

Следующий шаг — подключить сами проверки.

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

Если нужен полный разбор, вот хорошая статья:

https://milanjovanovic.tech/blog/health-checks-in-asp-net-core

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
1🍾1
Какие практики обработки ошибок в API на .NET считаются лучшими?

Я бы начал с главного — ошибки API должны возвращаться в едином формате.

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

Было бы удобно, если бы для всего этого существовал стандарт.

Он есть.

Называется Problem Details.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
3🍾1