HttpContext.Current.Session 不明确的行为布尔值
HttpContext.Current.Session unclear behaviour boolean
我在尝试获取存储在 HttpContext.Current.Session 的布尔值 属性 的值时遇到了一个奇怪的行为。
该对象是一个布尔值。首先,我尝试检查该对象是否存在,如果存在,则使用它。
我试图在 ?:
运算符中使用它,但它的行为很奇怪。这是我的手表 window:
前提
"ExistingKey"
键存在并且值为 false(如果键
不存在 returns 错误)。
结果
- 当检查
!=null
是否 returns 错误时(第一件事很奇怪)。
- 当使用
?:
运算符时,除了条件为假外,它returns第一个表达式,4(第二个很奇怪)。
有人可以解释这种行为吗?
注意:我并不是在寻求绕过这种情况的替代方法。只是问为什么会这样。
目前请不要将此视为答案,由于 space 和格式限制,以下内容写在答案中比写在评论中容易得多。
我同意问题的评论,第3行与其他行的结果不一致。我能想到的唯一可以解释的是 Visual Studio 中的 Watch window 数据陈旧/状态损坏。我认为执行相同的语句但在代码本身中可以证明或反驳这一点。以下代码与您的代码相同,但输出到 StringBuilder
。您能否执行此操作并 post 结果字符串,并让我们知道这是否与您手表 window 中的内容有任何不同?
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();
这似乎是手表中的某种错误 window。我测试了以下代码:
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;
}
}
我在手表中得到了以下内容 window:
因此您可以看到,在 Session 和 Dictionary 的情况下,!= null 的计算结果为 false。 Dictionary 正确评估此比较。
奇怪的是,'Session["ExistingValue"] != null' 和 'Session["ExistingValue"]' == null' 都是假的。
如果我先将会话值转换为 bool,然后再与 null 进行比较,我会得到正确的结果。
最后,如果我在代码中测试值 'Session["ExistingValue"] != null',我会得到一个正确的结果。这至少让我放心,这是手表中的东西 window,代码中不应该有类似的问题。
我所有的测试都是在 Visual Studio 2015 年进行的。
我在尝试获取存储在 HttpContext.Current.Session 的布尔值 属性 的值时遇到了一个奇怪的行为。
该对象是一个布尔值。首先,我尝试检查该对象是否存在,如果存在,则使用它。
我试图在 ?:
运算符中使用它,但它的行为很奇怪。这是我的手表 window:
前提
"ExistingKey"
键存在并且值为 false(如果键 不存在 returns 错误)。
结果
- 当检查
!=null
是否 returns 错误时(第一件事很奇怪)。 - 当使用
?:
运算符时,除了条件为假外,它returns第一个表达式,4(第二个很奇怪)。
有人可以解释这种行为吗?
注意:我并不是在寻求绕过这种情况的替代方法。只是问为什么会这样。
目前请不要将此视为答案,由于 space 和格式限制,以下内容写在答案中比写在评论中容易得多。
我同意问题的评论,第3行与其他行的结果不一致。我能想到的唯一可以解释的是 Visual Studio 中的 Watch window 数据陈旧/状态损坏。我认为执行相同的语句但在代码本身中可以证明或反驳这一点。以下代码与您的代码相同,但输出到 StringBuilder
。您能否执行此操作并 post 结果字符串,并让我们知道这是否与您手表 window 中的内容有任何不同?
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();
这似乎是手表中的某种错误 window。我测试了以下代码:
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;
}
}
我在手表中得到了以下内容 window:
因此您可以看到,在 Session 和 Dictionary
奇怪的是,'Session["ExistingValue"] != null' 和 'Session["ExistingValue"]' == null' 都是假的。
如果我先将会话值转换为 bool,然后再与 null 进行比较,我会得到正确的结果。
最后,如果我在代码中测试值 'Session["ExistingValue"] != null',我会得到一个正确的结果。这至少让我放心,这是手表中的东西 window,代码中不应该有类似的问题。
我所有的测试都是在 Visual Studio 2015 年进行的。