Как эта переменная кэшируется в этом коде? - PullRequest
0 голосов
/ 22 января 2019

Я унаследовал некоторый код MVC от другого разработчика. Существует статический класс, называемый DataCache, который содержит множество методов, примерно так:

public static IEnumerable<EntityFieldsList> UserGroupsFields()
{
    if (Cache["userGroupFields"] is List<EntityFieldsList> userGroupFields) return userGroupFields;

    ...some code...

    Cache.Set("userGroupFields", userGroupFields, policy);
    return userGroupFields;
}

Я не понимаю, как работает эта первая строка.

Как переменная userGroupFields объявляется как часть сравнения IS?

И как же тогда его значение сразу же возвращается в той же строке? Конечно, это всегда будет null?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Предыдущий ответ частично верен, но на самом деле оператор IS объявляет переменную независимо от того, выполняется условие или нет.

Смотрите здесь пример, попробуйте поменять местами первые две строки https://dotnetfiddle.net/biC0ks

0 голосов
/ 07 февраля 2019

Это так называемый тип шаблона ключевого слова is, который принимает вид:

expr is type varname 

где expr - это выражение, которое оценивает экземпляр некоторого типа, type - это имя типа, в который должен быть преобразован результат expr, и varname объект, в который преобразуется результат _expr), если тест is имеет значение true.
Выражение is равно true, если expr не равно NULL, и любое из следующего является истинным:

  • expr - это экземпляр того же типа, что и type .
  • expr - это экземпляр типа, производного от type.Другими словами, результат expr может быть преобразован в экземпляр type .
  • expr имеет тип времени компиляции, которыйбазовый класс type и expr имеет тип времени выполнения, равный type или производный от type .Тип переменной времени компиляции - это тип переменной, определенный в ее объявлении.Тип времени выполнения переменной - это тип экземпляра, назначенного этой переменной.
  • expr - это экземпляр типа, который реализует интерфейс type .

Если expr имеет значение true и is используется с оператором if, varname назначается и имеет локальную область действия в операторе ifтолько.

(выделено мое)

0 голосов
/ 22 января 2019
if (Cache["userGroupFields"] is List<EntityFieldsList> userGroupFields)

На английском языке, если возвращаемое значение Cache["userGroupFields"] равно List<EntityFieldsList>, тогда определите List<EntityFieldsList> userGroupFields

. Он использует шаблон типа is для обеспечения реализации типа IComparable.CompareTo(Object) method.

Ссылка


последняя часть вашего кода определенно не работает, если нет глобальной статической переменной с именем userGroupFields. Проверить это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...