以下哪个更好?
this.isLoggedIn = (bool)HttpContext.Current.Session["li"] == true;
或
this.isLoggedIn = (bool)HttpContext.Current.Session["li"];
仅当会话为真时才需要为true。如果会话设置为false,那么它会在#2中评估为true,因为它存在吗?还是在评估它的价值?
答案 0 :(得分:3)
第二个:
this.isLoggedIn = (bool)HttpContext.Current.Session["li"];
(bool)HttpContext.Current.Session["li"]
已经是布尔值(因此将是true
或false
),因此不需要额外的比较和返回布尔表达式的值。
无论哪种方式,您需要在尝试投射之前检查li
会话变量是否存在,否则您的代码将抛出(我认为是NullReferenceException
)。
答案 1 :(得分:2)
后者更清楚,IMO。它们在功能上是等价的 - 在这两种情况下,它将从会话中获取“li”的值并尝试将其转换为bool
,如果该值不存在则抛出异常。
答案 2 :(得分:1)
为所需值创建属性:
public bool IsLoggedIn {
get { return (bool)HttpContext.Current.Session["li"]; }
}
如果会话在课堂上经常使用,你甚至可以增加一个级别:
public bool IsLoggedIn {
get { return (bool)Session["li"]; }
}
private HttpSessionState Session {
get { return HttpContext.Current.Session; }
}
此外,如果您想要单独查看会话,请使用更好的密钥,例如"IsLoggedIn"
,而不是"li"
。
为这些应用程序范围的值创建一个特殊类可能会很好:
public static class MyAppSession {
const string IsLoggedInKey = "IsLoggedIn";
public static bool IsLoggedIn {
get {
return Session[IsLoggedInKey] != null && (bool)Session[IsLoggedInKey];
}
internal set { Session[IsLoggedInKey] = value; }
}
// ...
private static HttpSessionState Session {
get { return HttpContext.Current.Session; }
}
}
答案 3 :(得分:0)
第一种和第二种方法是等价的,但第一种方法是为了我的口味而详细说明。我更喜欢第二个。
就像我喜欢这个
bool accepted = true;
if( accepted)
{
..
}
优于
bool accepted = true;
if( accepted == true)
{
..
}
如果变量被正确命名,我觉得更清楚。
答案 4 :(得分:0)
只需将期望值放在表达式的位置,就会变得非常清楚:
First example:
Before: this.isLoggedIn = (bool)HttpContext.Current.Session["li"] == true;
After: this.isLoggedIn = true == true;
Second example:
Before: this.isLoggedIn = (bool)HttpContext.Current.Session["li"];
After: this.isLoggedIn = true;
现在,对false
案例尝试相同:
First example:
Before: this.isLoggedIn = (bool)HttpContext.Current.Session["li"] == true;
After: this.isLoggedIn = false == true;
Second example:
Before: this.isLoggedIn = (bool)HttpContext.Current.Session["li"];
After: this.isLoggedIn = false;
如您所见,两种方法之间的结果没有差异。这一切都归结为关于编码风格和可读性的问题,我猜你会发现你对短版本有偏见。
答案 5 :(得分:0)
您永远不需要编写代码:
bool x =(y == true);
而只是使用
bool x = y;
在您的具体情况下,您应该使用:
this.isLoggedIn = HttpContext.Current.Session["li"] != null
&& (bool)HttpContext.Current.Session["li"];
这样,如果尚未分配Session [“li”],您将不会收到异常。但是,如果Session [“li”]不能转换为bool,则会出现异常。
答案 6 :(得分:0)
我会将第二个选项与变量一起使用:
this.isLoggedIn =(bool)(HttpContext.Current.Session [“li”] ??“false”);
??是null-coalescing operator - 它为左侧的表达式赋予“false”值,以防它恰好为空。
答案 7 :(得分:-1)
两段代码都是相同的,所以第二段(它更短)就越好。