C#中的基本布尔逻辑

时间:2011-01-26 10:36:43

标签: c# asp.net boolean

以下哪个更好?

this.isLoggedIn = (bool)HttpContext.Current.Session["li"] == true;

this.isLoggedIn = (bool)HttpContext.Current.Session["li"];

仅当会话为真时才需要为true。如果会话设置为false,那么它会在#2中评估为true,因为它存在吗?还是在评估它的价值?

8 个答案:

答案 0 :(得分:3)

第二个:

this.isLoggedIn = (bool)HttpContext.Current.Session["li"];

(bool)HttpContext.Current.Session["li"]已经是布尔值(因此将是truefalse),因此不需要额外的比较和返回布尔表达式的值。

无论哪种方式,您需要在尝试投射之前检查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)

两段代码都是相同的,所以第二段(它更短)就越好。