HttpContext.Current.Session нечеткое поведение boolean
У меня странное поведение, пытающееся получить значение логического свойства, хранящегося в HttpContext.Current.Session.
Объект является логическим. Сначала я пытаюсь проверить, существует ли объект и, если существует, использовать его.
Я пытаюсь использовать его в операторе ?:
, но он ведет себя странно. Вот мое окно:
![Наблюдатели от VisualStudio]()
Предпосылка
- Клавиша
"ExistingKey"
существует и имеет значение false (если ключ
не существует возвращает false).
Результаты
- При проверке, если
!=null
он возвращает false (первое, что странно).
- При использовании оператора
?:
, кроме условия false, оно возвращает первое выражение, 4 (второе - странное).
Может ли кто-нибудь объяснить это поведение?
Примечание. Я не прошу альтернативы обходить эту ситуацию. Просто спрашивайте, почему это работает так.
Ответы
Ответ 1
Кажется, что-то вроде ошибки в окне часов. Я проверил следующий код:
protected void Page_Load(object sender, EventArgs e)
{
var objDict = new Dictionary<string, object>();
var boolDict = new Dictionary<string, bool>();
Session["ExistingValue"] = false;
bool? nullableValue = false;
Session["ExistingValueNullable"] = nullableValue;
var existingValue = (bool)Session["ExistingValue"];
var existingValueIsNotNull = Session["existingValue"] != null;
objDict["ExistingValue"] = false;
boolDict["ExistingValue"] = false;
bool existingValueIsNotNullIf = false;
if (Session["ExistingValue"] != null)
{
existingValueIsNotNullIf = true;
}
}
И в окне просмотра я получил следующее:
![Watch Window]()
Итак, вы можете видеть, что в случае сеанса и словаря < string, object > значение!= null принимает значение false. Словарь < string, bool > правильно оценивает это сравнение.
Странно, 'Session [ "ExistingValue" ]!= null' и 'Session [ "ExistingValue" ]' == null 'являются ложными.
Если сначала передать значение сеанса в bool, а затем сравнить с null, я получаю правильный результат.
Наконец, если я проверю значение "Session [" ExistingValue "]!= null 'в коде, я получаю правильный результат. Что, по крайней мере, успокаивает меня, что это что-то в окне часов, и не должно быть аналогичной проблемы в коде.
Все мои тесты были в Visual Studio 2015.
Ответ 2
Пожалуйста, не считайте это ответом на данный момент, гораздо легче написать ответ, чем в комментарии из-за ограничений пространства и форматирования.
Я согласен с комментариями к вопросу, строка 3 не согласуется с результатами других строк. Единственное, о чем я могу думать, это может объяснить, что окно Watch в Visual Studio имеет устаревшие данные/имеет поврежденное состояние. Я думаю, что выполнение тех же утверждений, но в самом коде, может доказать или опровергнуть это. Следующий код такой же, как и у вас, но выводится на StringBuilder
. Не могли бы вы выполнить это и опубликовать результирующую строку и сообщить нам, если это отличается от того, что у вас есть в окне "Часы"?
var session = HttpContext.Current.Session;
var builder = new System.Text.StringBuilder();
builder.AppendFormat("session[\"someKeyThatDoesNotExist\"] => value {0}", session["someKeyThatDoesNotExist"] ?? "null").AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] => value {0}", session["ExistingKey"] ?? "null").AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] != null => value {0}", session["ExistingKey"] != null).AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] != null ? 4 : 5 => value {0}", session["ExistingKey"] != null ? 4 : 5).AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] == null ? 4 : 5 => value {0}", session["ExistingKey"] == null ? 4 : 5).AppendLine();
var totalDebugInfo = builder.ToString();