HttpContext.Current.Session不明确的行为布尔值

时间:2016-08-26 08:45:11

标签: c# asp.net session httpcontext conditional-operator

我有一种奇怪的行为,试图获取存储在HttpContext.Current.Session的布尔属性的值。

该对象是一个布尔值。首先,我试图检查对象是否存在,如果存在,则使用它。

我正在尝试在?:运算符中使用它,但它表现得很奇怪。这是我的Watch窗口: Watchers from VisualStudio

前提

  • "ExistingKey"密钥存在且值为false(如果是密钥) 不存在返回false)。

结果

  1. 检查!=null时是否返回false(第一件事很奇怪)。
  2. 当使用?:运算符时,除了条件为false之外,它还会返回第一个表达式4(第二个奇怪的东西)。
  3. 有人可以解释这种行为吗?

    注意:我不是要求绕过这种情况的替代方案。只是问为什么会这样。

2 个答案:

答案 0 :(得分: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

所以你可以看到,在Session和Dictionary&lt; string,object&gt;的情况下!= null的计算结果为false。字典&lt; string,bool&gt;正确评估这种比较。

奇怪的是,'Session [“ExistingValue”]!= null'和'Session [“ExistingValue”]'== null'都是假的。

如果我首先将会话值转换为bool然后比较为null,我得到正确的结果。

最后,如果我在代码中测试值'Session [“ExistingValue”]!= null',我会得到一个合适的结果。这至少让我放心,这是观察窗口中的内容,代码中应该没有类似的问题。

我所有的测试都在Visual Studio 2015中进行。

答案 1 :(得分:0)

目前请不要认为这是一个答案,由于空格和格式限制,以下内容在答案中比在评论中写得容易得多。

我同意对这个问题的评论,第3行与其他行的结果不一致。我能想到的唯一可以解释的是,Visual Studio中的Watch窗口具有过时的数据/具有损坏的状态。我认为执行相同的语句但在代码本身可以证明或反驳这一点。以下代码与您拥有的代码相同,但输出到StringBuilder。您是否可以执行此操作并发布结果字符串,并告诉我们这与您在Watch窗口中的内容有何不同?

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();