Базовая логическая логика в 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" выражению с левой стороны, в случае, если оно окажется нулевым.
Обе части кода одинаковы, поэтому чем лучше вторая (тем короче).