Базовая логическая логика в C#

Что лучше из следующего?

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

или же

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

Это должно быть истинным ТОЛЬКО, когда сеанс является истинным. Если для сеанса установлено значение false, будет ли это оцениваться как true в #2, как он существует? Или это оценка его стоимости?

8 ответов

Решение

Второй:

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

(bool)HttpContext.Current.Session["li"] уже логическое значение (так будет либо true или же false), поэтому нет необходимости в дополнительном сравнении и возвращаемом значении логического выражения.

В любом случае, вы должны проверить, что li переменная сеанса существует, прежде чем пытаться ее привести, или ваш код сгенерирует (я думаю, NullReferenceException).

Последнее понятнее, ИМО. Хотя они функционально эквивалентны - в обоих случаях он извлечет значение "li" из сеанса и попытается привести его к bool, выбрасывая исключение, если значение отсутствует.

Создайте свойство для желаемого значения:

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; }
  }

}

Вам никогда не нужно писать код, который говорит:

bool x = (y == true);

Вместо этого просто используйте

bool x = y;

В вашем конкретном случае вы должны использовать:

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

Таким образом, вы не получите исключение, если сеанс ["li"] еще не назначен. Однако вы получите исключение, если Session["li"] не может быть преобразован в bool.

Первый и второй подход эквивалентны, но первый - многословен на мой вкус. Мне больше нравится второй.

Так же, как мне это нравится

bool accepted = true;
if( accepted)
{
  ..
}

Лучше чем

bool accepted = true;
if( accepted == true)
{
  ..
}

Я чувствую, что так будет яснее, если переменные правильно названы.

Просто поместите ожидаемое значение в место выражения, и оно станет довольно понятным:

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;

Как видите, между двумя подходами не будет никакой разницы в результате. Все сводится к вопросам о стиле кодирования и удобочитаемости, где я думаю, что вы найдете уклон в сторону более короткой версии.

Я бы использовал второй вариант с вариантом:
this.isLoggedIn = (bool) (HttpContext.Current.Session ["li"]?? "false");

?? является оператором слияния с нулем - он дает значение "false" выражению с левой стороны, в случае, если оно окажется нулевым.

Обе части кода одинаковы, поэтому чем лучше вторая (тем короче).

Другие вопросы по тегам