Проблемы с кэшем памяти. TryGetValue возвращает false

#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