✅ Как
FirstOrDefault
, так и Find
используются для поиска первого элемента в коллекции, удовлетворяющего определенному условию.🚀 Find: потенциально может быть быстрее для коллекций в памяти (например,
List<T>
), поскольку потенциально может использовать прямое индексирование для поиска элемента.💡 Это относится к следующим типам коллекций:
List
, Array
, ImmutableList
.#tip #csharp #dotnet by Jalal Alzebda
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 UUID v7 в .NET 9
.NET изначально поддерживает UUID v4 через
📌 UUID v7
Так как
Основным преимуществом является включение метки времени в UUID. Это дает 122 бита энтропии, включая 6 бит для версии и варианта где-то посередине.
Главное преимущество заключается в том, что вы можете сортировать UUID по времени их создания, что делает их более подходящими для баз данных по сравнению с UUID v4.
📌 Контроль метки времени
Поскольку метод ожидает
#csharp #dotnet #tip by
Steven Giesel
.NET изначально поддерживает UUID v4 через
Guid.NewGuid().
Но начиная с предварительной версии 7, появилась поддержка UUID версии 7.📌 UUID v7
Так как
GUID
является альтернативным названием для UUID,
новый API находится в пространстве имен System.Guid:
var guid = Guid.CreateVersion7();
var guidWithTimestamp = Guid.CreateVersion7(DateTimeOffset.UtcNow);
Основным преимуществом является включение метки времени в UUID. Это дает 122 бита энтропии, включая 6 бит для версии и варианта где-то посередине.
Главное преимущество заключается в том, что вы можете сортировать UUID по времени их создания, что делает их более подходящими для баз данных по сравнению с UUID v4.
📌 Контроль метки времени
Поскольку метод ожидает
DateTimeOffset,
вызывающая функция может использовать TimeProvider для контроля UtcNow:
var uuid = Guid.CreateVersion7(timeProvider.GetUtcNow());
timeProvider
может быть получен через DI контейнер и подделан в тестовых сценариях.#csharp #dotnet #tip by
Steven Giesel
💡 Начиная с C# 7 мы можем использовать символ _ для улучшения читаемости числовых литералов. Это особенно полезно для больших чисел и предназначено только для читаемости.
#dotnet #csharp #tip by Dave Callan
#dotnet #csharp #tip by Dave Callan
#csharp #dotnet #tip by Karen Payne
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠️ Пример параметризованного теста xUnit
Вместо того, чтобы добавлять множество различных тестовых методов с разными входными данными, заданными в теле метода, мы создаем один метод, передаем в него входные данные и ожидаемые результаты для каждого теста в виде параметров.
Это означает меньшее количество тестовых методов (что упрощает изменение логики тестов) и возможность быстро увидеть все входные данные и ожидаемые результаты для конкретного метода вместе.
В примере используется атрибут
#dotnet #csharp #tip by Dave Callan
Вместо того, чтобы добавлять множество различных тестовых методов с разными входными данными, заданными в теле метода, мы создаем один метод, передаем в него входные данные и ожидаемые результаты для каждого теста в виде параметров.
Это означает меньшее количество тестовых методов (что упрощает изменение логики тестов) и возможность быстро увидеть все входные данные и ожидаемые результаты для конкретного метода вместе.
В примере используется атрибут
[ClassData]
, который загружает тестовые данные из отдельного класса, реализующего IEnumerable<object[]>
.#dotnet #csharp #tip by Dave Callan
🛠️ Пример модульного теста C# с использованием паттерна Builder
💬 Кто использует паттерн Builder для настройки тестовых данных? В каких ситуациях оправданы дополнительные накладные расходы на обслуживание?
#dotnet #csharp #tip by Dave Callan
💬 Кто использует паттерн Builder для настройки тестовых данных? В каких ситуациях оправданы дополнительные накладные расходы на обслуживание?
#dotnet #csharp #tip by Dave Callan
Он был представлен в C# 11. Видимость созданного типа ограничена исходным файлом, в котором он объявлен.
Эта фича помогает избегать конфликтов имен при написании генераторов исходного кода.
💬 Как думаете, в каких кейсах его еще можно применить?
#dotnet #csharp #tip by Oleg Kyrylchuk
Please open Telegram to view this post
VIEW IN TELEGRAM
🔼 Spread element в C# 12: простой пример
Идея похожа на
💬 Уже пользовались?
#dotnet #csharp #tip by Dave Callan
Идея похожа на
...
( три точки) в JavaScript и используется для объединения коллекций.💬 Уже пользовались?
#dotnet #csharp #tip by Dave Callan
Начиная с версии 17.12 Preview 2, больше не нужно явно повторять значения, которые используются в разных окружениях.
#dotnet #csharp #tip by Dave Callan
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблема заключалась в том, что обработчик исключений по умолчанию всегда устанавливал HTTP-код состояния ответа равным 500.
В ASP NET Core 9 представлена новая опция
StatusCodeSelector
, которая позволяет выбирать код состояния на основе исключения.👉 Подробнее
#dotnet #csharp #tip by Oleg Kyrylchuk
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
#dotnet #csharp #tip by Dave Callan
Please open Telegram to view this post
VIEW IN TELEGRAM
🥳 Новый формат .NET-решения .slnx теперь доступен в последней превью-версии Rider
Этот формат находится в режиме превью в Visual Studio, а теперь еще и в Rider. Кажется, с новым форматом улучшена читаемость и возможность слияния (mergeability). Выше — пример различий по сравнению с существующим форматом для простого решения.
#dotnet #csharp #tip by Dave Callan
Этот формат находится в режиме превью в Visual Studio, а теперь еще и в Rider. Кажется, с новым форматом улучшена читаемость и возможность слияния (mergeability). Выше — пример различий по сравнению с существующим форматом для простого решения.
#dotnet #csharp #tip by Dave Callan
По умолчанию он проверяет все правила и объединяет сообщения об ошибках. Более эффективно устанавливать
CascadeMode
либо на уровне класса, либо на уровне цепочки правил, особенно при использовании MustAsync
и асинхронных операций.#dotnet #csharp #tip by Saeed Esmaeelinejad
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как можно аннотировать основной конструктор атрибутом?
Ранее, если у записи/класса/структуры было несколько конструкторов, возникала проблема с десериализацией, так как необходимо было указать атрибут
Начиная с C# 12, можно использовать method attribute target для указания конструктора☝️
#dotnet #csharp #tip by Oleg Kyrylchuk
Ранее, если у записи/класса/структуры было несколько конструкторов, возникала проблема с десериализацией, так как необходимо было указать атрибут
JsonConstructor
в основном конструкторе.Начиная с C# 12, можно использовать method attribute target для указания конструктора☝️
#dotnet #csharp #tip by Oleg Kyrylchuk
💡 Parameter Object Pattern
Если метод принимает много связанных параметров, рассмотрите возможность группировки их в объект, чтобы упростить модификацию и сигнатуры.
Очень полезно, когда группа параметров часто используется повторно.
#dotnet #csharp #tip by Dave Callan
Если метод принимает много связанных параметров, рассмотрите возможность группировки их в объект, чтобы упростить модификацию и сигнатуры.
Очень полезно, когда группа параметров часто используется повторно.
#dotnet #csharp #tip by Dave Callan
🤔 Согласитесь, что глубоко вложенный код трудно читать?
В методах с большим количеством вложений можно использовать подход Early Return и Guard Clause, чтобы сделать код более удобным для чтения.
#dotnet #csharp #tip by Dave Callan
В методах с большим количеством вложений можно использовать подход Early Return и Guard Clause, чтобы сделать код более удобным для чтения.
#dotnet #csharp #tip by Dave Callan
🚀 Сравнение производительности конкатенации строк в .NET 9
Есть и другие подходы, когда нам нужна ещё более высокая производительность, но из распространённых подходов, показанных ниже,
#dotnet #csharp #tip by Dave Callan
Есть и другие подходы, когда нам нужна ещё более высокая производительность, но из распространённых подходов, показанных ниже,
StringJoin
выигрывает. #dotnet #csharp #tip by Dave Callan