dotnet tool install -g csharprepl
MemoryCache— структура данных для кеширования объектов в памяти. • Простой пример:
public async Task• Пример упрощенного использованияGetBlogPost(int id) { var cacheKey = $"BlogPost_{id}"; if (!_memoryCache.TryGetValue(cacheKey, out BlogPost blogPost)) { blogPost = await _blogRepository.GetBlogPostByIdAsync(id); _memoryCache.Set(cacheKey, blogPost); } return Ok(blogPost); }
MemoryCache:
public async Task📌GetBlogPost(int id) { var cacheKey = $"BlogPost_{id}"; var blogPost = await _memoryCache.GetOrCreateAsync(cacheKey, async entry => { return await _blogRepository.GetBlogPostByIdAsync(id); }); return Ok(blogPost); }
IDistributedCacheиспользуется для кеширования между несколькими сервисами и/или для сохранения данных на длительный срок (переживание перезагрузок сервера). • Пример регистрации Redis в качестве провайдера кеша:
builder.Services.AddStackExchangeRedisCache(options => { ... });• Пример регистрации SQL Server в качестве провайдера кеша:
builder.Services.AddDistributedSqlServerCache(options => { options.ConnectionString = builder.Configuration.GetConnectionString("DistCache_ConnectionString"); options.SchemaName = "dbo"; options.TableName = "TestCache"; });• Пример использования
IDistributedCache:
public class SomeService(IDistributedCache cache) { public async Task📌GetSomeInformationAsync(string name, int id, CancellationToken token = default) { var key = $"someinfo:{name}:{id}"; var bytes = await cache.GetAsync(key, token); SomeInformation info; if (bytes is null) { info = await SomeExpensiveOperationAsync(name, id, token); bytes = SomeSerializer.Serialize(info); await cache.SetAsync(key, bytes, token); } else { info = SomeSerializer.Deserialize (bytes); } return info; } private async Task SomeExpensiveOperationAsync(string name, int id, CancellationToken token = default) { // ... Реализация } }
HybridCacheсовмещает функции
MemoryCacheи
DistributedCache. Простой пример использования:
public class SomeService(HybridCache cache) { public async Task✅GetSomeInformationAsync(string name, int id, CancellationToken token = default) { return await cache.GetOrCreateAsync( $"someinfo:{name}:{id}", async cancel => await SomeExpensiveOperationAsync(name, id, cancel), token: token ); } }
HybridCacheподдерживает явное удаление по ключу, настройку сериализации и позволяет избежать некоторых проблем
IDistributedCache.
StringSyntax(.NET 7+) позволяет нам сообщить Visual Studio, с каким типом строки (например, регулярное выражение, формат datetime, JSON и т. д.) мы работаем, чтобы получить корректный IntelliSense и подсветку синтаксиса. #dotnet #tip #visualstudio by Dave Callan
sudo apt update sudo apt install dotnet8👉 Подробнее
TouchBehavior(ранее известного как
TouchEffect`), изменения в работе `Snackbarна Windows, а также новые возможности, включая изменение цвета навигационной панели на Android. Если вы использовали Xamarin Community Toolkit в своих приложениях Xamarin.Forms, вы, вероятно, знакомы с
TouchEffect. В .NET MAUI эффекты были устаревшими, и их следовало заменить на
PlatformBehaviors. Именно это и было сделано для реализации данной функциональности в .NET MAUI.
TouchBehaviorпозволяет взаимодействовать с любым визуальным элементом в вашем приложении на основе касаний, кликов мыши и событий наведения. Реализация
TouchBehaviorдает возможность настраивать различные визуальные свойства элемента, к которому он прикреплен, такие как цвет фона, непрозрачность, поворот и масштаб. Кроме того,
TouchBehaviorпозволяет реализовывать жесты длительного нажатия и выполнять код при длительном нажатии на любой визуальный элемент. 👉 Подробнее
recordи как они могут значительно сократить дублирование в ваших классах, показал два разных подхода, которые вы можете использовать: инициализацию полей и свойств или implicit capture. И многое другое👇 🔗 Читать
OrderBy.ToListВ новой версии .NET улучшена производительность метода
OrderBy, за счет использования Vector. 📌 Улучшения
Chunkдля
Array<T>Метод
Chunkтеперь специализирован для массивов (`Array
ReadOnlySpan, которое позволяет уменьшить количество необходимых аллокаций и увеличить производительность. 📌 Улучшения
OfTypeи
CastМетоды
OfTypeи
Castтеперь обрабатывают данные быстрее за счет оптимизации обработки типов. Это улучшение позволяет быстрее фильтровать данные по типу, что демонстрируется уменьшением времени выполнения операций. 📌 Улучшения
AnyМетод
Any, который проверяет наличие элементов в последовательности, теперь работает значительно быстрее благодаря оптимизации метода
TryGetNonEnumeratedCount. Это улучшение позволяет методу
Anyбыстро определить, есть ли элементы в последовательности, не перебирая все элементы. 👉 Подробнее
Invoke-Commandв PS можно использовать с флагом
-AsJobдля параллельного запуска команд на нескольких компьютерах. #powershell #tip by Adam Bertman
HttpClientтак, чтобы не получать
429 Too Many Requests. 👉 Читать
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.?Для решения этой проблемы Steven Giesel предложил ввести механизм версионности, который заключается в следующем: ☑️ В классе списка вводится поле
version,которое инкрементируется каждый раз при изменении списка (добавлении, удалении элементов или изменении существующих). ☑️ При создании итератора для перечисления элементов списка запоминается текущее значение
version.☑️ В каждом вызове метода
MoveNext()итератора происходит проверка: если текущее значение
versionсписка отличается от значения, зафиксированного при создании итератора, генерируется исключение
InvalidOperationException.Это предотвращает непредвиденные последствия от изменения коллекции во время её перебора. Таким образом, при попытке изменить список в процессе его перечисления, система обнаруживает несоответствие версий и активно препятствует продолжению некорректной операции, защищая от ошибок выполнения и потенциальных багов в программе.
DbUpdateException. Если вам нужно выяснить, было ли исключение вызвано уникальным ограничением, слишком длинным значением или отсутствием значения для обязательного столбца, вам нужно будет изучить конкретный экземпляр подкласса
DbExceptionи проверить код ошибки, чтобы определить точную причину.
EntityFramework.Exceptionsупрощает это, обрабатывая все специфичные для базы данных детали и выбрасывая разные исключения. Всё, что вам нужно сделать, это настроить
DbContext, вызвав
UseExceptionProcessor, и обработать такие исключения, как
UniqueConstraintException,
CannotInsertNullException,
MaxLengthExceededException,
NumericOverflowException,
ReferenceConstraintException. В случае
UniqueConstraintExceptionи
ReferenceConstraintExceptionвы можете получить имя связанного ограничения с помощью свойства
ConstraintName.
ConstraintPropertiesбудет содержать свойства, которые являются частью ограничения. 📦 NuGet
[MemberNotNullWhen]помогает компилятору указать, при каких условиях указанное поле или свойство не имеет значения
NULL, что улучшает статический анализ кода. #csharp #tip by Łukasz Żabski
readonly— это ключевое слово в C#, которое можно применять к полям. Когда поле помечено как
readonly, это означает, что ему можно присвоить значение только во время объявления или в конструкторе класса. Steven Giesel разбирается, как
readonlyвлияет на производительность. 👉 TLDR Выигрыш в производительности есть, но он незначительный. Основная причина использования
readonlyполей — сделать код более надежным и сопровождаемым, а не быстрым.
TryGetNonEnumeratedCountОн опредяет количество элементов в последовательности без необходимости принудительной итерации по ней. Особенно полезно для
IQueryable, когда при вызове метода
Countвы не хотите выполнять полный запрос. #csharp #dotnet #tip by Oleg Kyrylchuk
Equalsи
GetHashCode. Насколько это важно? Очень важно! Вы можете получить ужасную производительность, поскольку
GetHashCodeпо умолчанию в структуре просто получает хэш-код первого поля! 👩💻 GitHub