Может ли кто-нибудь подумать об элегантном способе уменьшения этого вложенного оператора if-else?
if (Request.QueryString["UseGroups"] != null)
{
if (Request.QueryString["UseGroups"] == "True")
{
report.IncludeGroupFiltering = true;
}
else
{
report.IncludeGroupFiltering = false;
}
}
else
{
report.IncludeGroupFiltering = false;
}
Ответы
Ответ 1
Просто одна проверка:
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
Нет необходимости оценивать Request.QueryString["UseGroups"]
дважды - он может быть равен только "True", если он не равен null, и сравнение будет отлично работать (и возвращает false), если оно равно null.
Любые решения, все еще выполняющие две операции, слишком усложняют вопросы:)
Ответ 2
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"
Ответ 3
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
Ответ 4
Я думаю, что Request.QueryString["UseGroups"] == "True"
и "True" - это только строка, она не ведет себя как bool.
Так,
вы можете написать в строке
report.IncludeGroupFiltering = string.IsNullOrEmpty(Request.QueryString["UseGroups"])?
false : (Request.QueryString["UseGroups"] == "True");
Ответ 5
report.IncludeGroupFiltering = "True" == Request.QueryString["UseGroups"];
Ответ 6
Измените часть Request.QueryString [ "UseGroups" ], чтобы она поняла, что вы хотите ссылаться на одну и ту же вещь, а затем она становится:
string useGroups = Request.QueryString["UseGroups"];
report.IncludeGroupFiltering = (useGroups != null) && (useGroups == "True");
Ответ 7
report.IncludeGroupFiltering = (Request.QueryString["UseGroups"] != null)
&& (Request.QueryString["UseGroups"] == "True");
Ответ 8
Вы делаете это в основном так, как я. Просто удалите избыточное внутреннее другое:
if(Request.QueryString["USeGroups"] != null)
{
if(Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
}
else report.IncludeGroupFiltering = false;
Ответ 9
Возможно, это:
report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
Ответ 10
Как насчет использования TryParse:
bool includeGroupFiltering;
bool throwaway = Boolean.TryParse(Request.QueryString["UseGroups"], out includeGroupFiltering);
report.IncludeGroupFiltering = includeGroupFiltering;
Ответ 11
Вот как я делаю такой код:
report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] != null &&
Request.QueryString["UseGroups"] == "True" //note that I am not a C# expert - this line /may/ throw an exception if it is indeed null.
{
report.IncludeGroupFiltering = true;
}
Ответ 12
report.IncludeGroupFiltering = ShouldIncludeGroupFiltering(Request.QueryString["UseGroups"])
private boolean ShouldIncludeGroupFiltering(String queryString) {
return ("True" == queryString)
}
Ответ 13
Строковые константы неизменяемы и распыляются, они также являются ссылочными объектами. Однако результат Request.QueryString [ "UserGroups" ] является строковой ссылкой (или ссылкой на объект, который может быть неявно преобразован в строку...), который не может быть распылен, поэтому вы не можете просто сравнить ссылки, которые могут быть четными, даже если строки сравниваются.
Оператор == на парах строк не сравнивает ссылки, а содержит содержимое строки. Это означает, что Request.QueryString [ "UserGroups" ] будет разыменован, и это может привести к исключениям разыменования нулевого указателя. Вот почему существует предварительный тест для null (потому что тесты с "reference == null" НЕ разыменовывают ссылку, но фактически проверяют, является ли она нулевой или нет).
Однако существует возможность избежать нулевой проверки: вы можете использовать оператор === только для сравнения ссылки, если результат Request.QueryString [ "Пользовательские группы" ] был распылен (но для этого может потребоваться выделение и хеширование в статическом списке атомов, не очень хорошая идея, если QueryString очень велика.
Итак, лучше всего сначала кэшировать Querystring в локальной строковой переменной и выполнить два теста:
final string queryString; // cache the string value
if ((queryString = Request.QueryString["UserGroups"]) != null &&
queryString == "True") {
...
} else {
...
}
Но учитывая, что тела вашего оператора if/else - это просто сохранить результат условия if(), просто напишите это:
final string queryString; // temporary register caching the non-atomized string reference
report.IncludeGroupFiltering =
(queryString = Request.QueryString["UserGroups"]) != null &&
queryString == "True"; // compares the two strings contents
НО ТОЛЬКО, ЕСЛИ содержимое Request.QueryString [] уже является атомизированными строками, или если их неявное преобразование в строку возвращает атомизированные строки, сохраните строку, сравнивая и используйте === вместо:
final string queryString; // temporary register caching the atomized string reference
report.IncludeGroupFiltering =
(queryString = Request.QueryString["UserGroups"]) != null &&
queryString === "True"; // compares the atomized references
Я не буду предлагать это опасное предположение (более вероятно, что результаты запроса из удаленного источника не будут распыляться по соображениям безопасности/памяти, если только возвращаемое значение уже не было проверено. Учитывая ваш код, я подозреваю, что это выполняет валидацию по возвращаемым значениям из вашего запроса, поэтому результат, скорее всего, не распыляется: основная причина вашего кода заключается в том, чтобы распылить содержимое строки запроса в общее логическое значение, которое позже будет намного легче сравнивать.
Примечание. Я абсолютно не знаю, каков тип значения или ссылки, возвращаемой Request.QueryString [ "UserGroups" ]. Может случиться так, что это объект, реализующий метод "bool operator == (string)", или даже возвращает другой тип, чем bool. Однако сохранение возвращаемого объекта в строковой переменной будет выполнять преобразование в строку, если тип объекта не является нулевым (и если объект совместим, в противном случае вы получите исключение).
Возможно, вы захотите избежать этого преобразования неизвестного объекта, если сам объект может сравниться со строкой типа "Истина", с таким кодом:
report.IncludeGroupFiltering =
Request.QueryString["UserGroups"] != null &&
// uses object operator==(string) to compare its contents OR reference.
Request.QueryString["UserGroups"] == "True";
Все это зависит от того, как вы объявили свойство массива QueryString [] вашего объекта Request, и если содержимое массива может быть полиморфным (различный тип). Если вы знаете, как это объявлено, используйте один и тот же тип для объявления временного окончательного регистра выше, чтобы избежать двойного доступа члена к QueryString из запроса и двойной индексации массива QueryString.
Здесь невозможно узнать, какой код будет лучше для вас, поскольку у нас нет всех объявлений (С# наследует ту же сложность/неопределенность типа, что и С++, со слишком многими неявными преобразованиями и сложными схемами наследования).