#c# #.net-core
#c# #.net-ядро
Вопрос:
В этом фрагменте кода я просто помещаю null в MemoryCache, а затем проверяю, существует ли этот ключ:
var _cache = new MemoryCache(new MemoryCacheOptions());
_cache.Set<string>(cacheKey, null);
var isInCache = _cache.TryGetValue(cacheKey, out string nothing);
В этом случае значение isInCache равно false. Ожидается ли такое поведение?
Я использую .Консольное приложение NET Core 2.2.
Комментарии:
1. Опоздал на вечеринку, но я разбираюсь с предложениями компилятора и наткнулся на этот пост. Я нахожусь на .Net 7, и TryGetValue хочет вернуть значение с нулевым значением. Поскольку вы определяете свой возврат не с помощью string? но со строкой…. Интересно, в этом ли ваша проблема.
Ответ №1:
Основываясь на исходном коде для TryGetValue()
, оно вернет false
значение null при проверке типа if (result is TItem item)
. Однако .Count
свойство вернет 1. (спасибо комментарию @jgoday за эти подробности).
Альтернативой является наличие «нулевого значения» (например, Guid.NewGuid()
), которое вы можете использовать для представления нулевого значения, таким образом, что-то вводится в кэш, чтобы вы могли проверить, добавлялось ли это когда-либо.
public class MyCache
{
private MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
private string nullValue = Guid.NewGuid().ToString();
public void Set(string cacheKey, string toSet)
=> _cache.Set<string>(cacheKey, toSet == null ? nullValue : toSet);
public string Get(string cacheKey)
{
var isInCache = _cache.TryGetValue(cacheKey, out string cachedVal);
if (!isInCache) return null;
return cachedVal == nullValue ? null : cachedVal;
}
}
Комментарии:
1. Документация не для
Microsoft.Extensions.Caching.Memory
сборки, используемой операционной системой.2. В dotnet.core на самом деле не документировано, но основано на исходном коде ( github.com/aspnet/Caching/blob/master/src / … ), расширение TryGetValue никогда не вернет true, если значение равно null ( null — это Titem всегда false), однако свойство Count вернет 1. Это похоже на небольшое несоответствие…
3. Извините за неправильную ссылку. Обновлено с подробностями от @jgoday