2010-07-30 7 views
13
if (Request.QueryString["UseGroups"] != null) 
{ 
    if (Request.QueryString["UseGroups"] == "True") 
    { 
    report.IncludeGroupFiltering = true; 
    } 
    else 
    { 
    report.IncludeGroupFiltering = false; 
    } 
} 
else 
{ 
    report.IncludeGroupFiltering = false; 
} 
+0

Twój kod wskazuje na brak zrozumienia typu boolowskiego. Rzadko (jeśli w ogóle) musisz robić rzeczy takie jak "If (something == true) somethingElse = true; –

+13

@Ed, on does not doing if (something == true), on doing if (something ==" True "). –

Odpowiedz

47

Wystarczy jeden czek:

report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"; 

Nie ma potrzeby, aby ocenić Request.QueryString["UseGroups"] dwa razy - to może być tylko równe "True" jeśli jest niezerowe, a porównanie będzie działało idealnie (i zwraca fałsz), jeśli jest to jest równe null.

Wszelkie rozwiązania nadal robi dwie operacje są nadmiernie komplikuje sprawy :)

+0

Działa to, gdy indeksator zwraca wartość null i nie generuje wyjątku, jeśli klucz nie zostanie znaleziony – Will

+2

Jeśli to rozwiązanie wyrzuciłoby, oryginał kod również zostałby wyrzucony, więc zachowanie byłoby takie samo –

+0

Ah, więc Request.QueryString ["SomethingNotThere"] nie wygeneruje wyjątku odwołania do obiektu, jeśli spróbuję go porównać? Musiałem pomylić to zachowanie z tym ViewData [ "NonDefined"] – BigOmega

0
report.IncludeGroupFiltering = (Request.QueryString["UseGroups"] != null) 
           && (Request.QueryString["UseGroups"] == "True"); 
+0

Sprawdzanie 'null' nie jest wymagane podczas porównywania instancji' string'. –

14

 
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"; 

0

robisz to w zasadzie tak, jak będzie. Wystarczy usunąć zbędny wewnętrzna innego:

if(Request.QueryString["USeGroups"] != null) 
{ 
    if(Request.QueryString["UseGroups"] == "True") 
    report.IncludeGroupFiltering = true; 
} 
else report.IncludeGroupFiltering = false; 
+1

To się nie uda. Jeśli UseGroups ma wartość inną niż null, ale nie "True", to IncludeGroupFiltering nigdy nie jest ustawione. –

+0

Prawda. Zwykle zakładam, że wartość bool jest ustawiona na false, a następnie aktualizowana do wartości true - w tym przypadku ostatnia linia może również zostać wyłączona. Prawdopodobnie nieprawidłowe założenie. – AllenG

21
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True" 
0

Może to:

report.IncludeGroupFiltering = false; 
if (Request.QueryString["UseGroups"] == "True") 
    report.IncludeGroupFiltering = true; 
2

report.IncludeGroupFiltering = "True" == Request.QueryString["UseGroups"];

+8

if ("blue" == theSky) –

+0

To jest wspomnienie unikania wywołania 'equals' na' null' :) – thelost

0

Co na temat korzystania TryParse:

bool includeGroupFiltering; 
bool throwaway = Boolean.TryParse(Request.QueryString["UseGroups"], out includeGroupFiltering); 
report.IncludeGroupFiltering = includeGroupFiltering; 
+1

Tak naprawdę nie próbowałem uruchomić tego kodu, ale wydaje się, że podczas gdy początkowo masz Prawidłowa wartość true lub false przypisana do includeGroupFiltering, spowoduje natychmiastowe nadpisanie jej wartością true/false wskazującą, czy analiza zakończyła się pomyślnie. Tak więc skończyłbyś z prawdą, jeśli przeszedłeś w "true" * lub * "false". – stack

+0

@stack, masz rację, przeznaczone do użycia var. Zaktualizowano. –

1

Factor listę Request.QueryString ["UseGroups"] part to mak e jasno chcesz odnosić się do tego samego, a następnie staje się:

string useGroups = Request.QueryString["UseGroups"]; 
report.IncludeGroupFiltering = (useGroups != null) && (useGroups == "True"); 
3

myślę Request.QueryString["UseGroups"] == "True" i „Prawda” jest ciągiem tylko, że nie zachowuje się jak bool. Więc można napisać w linii

report.IncludeGroupFiltering = string.IsNullOrEmpty(Request.QueryString["UseGroups"])? 
           false : (Request.QueryString["UseGroups"] == "True"); 
0

ten sposób zrobić tego rodzaju kodu:

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

Stałe łańcuchowe są niezmienne i rozpylane, są one również odwoływać obiektów. Jednak wynik Request.QueryString ["UserGroups"] jest referencją do łańcucha (lub odniesieniem do obiektu, który może być niejawnie przekonwertowany na ciąg ...), który może nie być atomizowany, więc nie możesz po prostu porównać referencji, które mogą być odrębne, nawet jeśli struny porównywane są jednakowo.

Operator == na parach ciągów znaków nie porównuje odniesień, ale zawartość ciągów znaków. Oznacza to, że Request.QueryString ["UserGroups"] zostanie dereferencjonowany, a to może spowodować wyjątki dereferencji wskaźnika zerowego. Dlatego istnieje test wstępny dla wartości null (ponieważ testy z "reference == null" NIE WYWOŁUJĄ odwołania, ale w rzeczywistości sprawdzają, czy jest zerowy czy nie).

Istnieje jednak możliwość uniknięcia sprawdzania zerowego: możesz użyć operatora === do porównania referencji, jeśli wynik zapytania .QueryString ["Grupy użytkowników"] został zatomizowany (ale może wymagać przydziału i hashowanie na statycznej liście atomów, nie jest dobrym pomysłem, jeśli QueryString jest bardzo duży.

Więc tak, najlepiej zrobić to pierwszy cache ciągu kwerendy w zmiennej łańcuchowej lokalnym oraz wykonać dwa testy:

final string queryString; // cache the string value 
if ((queryString = Request.QueryString["UserGroups"]) != null && 
    queryString == "True") { 
    ... 
} else { 
    ... 
} 

Ale biorąc pod uwagę, że ciała swoje if/else jest po prostu zapisać wynik if() 's stan, wystarczy napisać tak:

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 

ale tylko jeśli [] zawartość Request.QueryString już rozpyla struny, lub gdy ich niejawna konwersja do powrotu ciąg rozpylonych strun, zapisz ciąg porównuje i używa === zamiast:

final string queryString; // temporary register caching the atomized string reference 
report.IncludeGroupFiltering = 
    (queryString = Request.QueryString["UserGroups"]) != null && 
    queryString === "True"; // compares the atomized references 

nie będę sugerują, że to niebezpieczne założenie tutaj (to jest bardziej prawdopodobne, że wyniki kwerendy z odległego źródła nie zostaną rozpylone, ze względów bezpieczeństwa/pamięci, chyba że zostało już sprawdzone zwrócona wartość. Biorąc pod uwagę twój kod, podejrzewam, że jest to sprawdzanie poprawności zwróconych wartości z twojego zapytania, więc wynik najprawdopodobniej nie jest atomizowany: głównym powodem twojego kodu jest atomizacja zawartości Ciągu Zapytania do wspólnej wartości boolowskiej, która będzie później porównać znacznie łatwiej.


Uwaga: Ja absolutnie nie wiem, jaki jest typ wartości lub odniesienie zwrócony przez Request.QueryString [ „Grupy”]. Może się zdarzyć, że jest to obiekt, który implementuje metodę "bool operator == (ciąg)" lub która zwraca inny typ niż bool. Przechowywanie zwróconego obiektu w zmiennej łańcuchowej spowoduje jednak konwersję na ciąg znaków, jeśli typ obiektu nie jest pusty (i jeśli obiekt jest zgodny, w przeciwnym razie wystąpi wyjątek).

Możesz uniknąć tej konwersji nieznanego obiektu, jeśli sam obiekt można porównać do łańcucha jak „True”, z kodu:

report.IncludeGroupFiltering = 
    Request.QueryString["UserGroups"] != null && 
    // uses object's operator==(string) to compare its contents OR reference. 
    Request.QueryString["UserGroups"] == "True"; 

Wszystko to zależy od sposobu ogłoszony QueryString [] właściwość tablicy obiektu Request i jeśli zawartość tablicy może być polimorficzna (zmienny typ). Jeśli wiesz, jak to jest zadeklarowane, użyj dokładnie tego samego typu do zadeklarowania tymczasowego rejestru końcowego powyżej, aby uniknąć podwójnego dostępu do QueryString z żądania i podwójnego indeksowania tablicy QueryString.

Tutaj nie można stwierdzić, który kod będzie najlepszy dla ciebie, ponieważ nie mamy wszystkich deklaracji (C# dziedziczy złożoność/niejasność tego samego typu co C++, ze zbyt wieloma niejawnymi konwersjami i złożonymi schematami dziedziczenia).

+1

'Request.QueryString [string]' zwraca ciąg znaków, który czyni większość tej dyskusji. –

+0

To było niemożliwe do określenia ze swojego wpisu. Moja odpowiedź była dokładna i obejmowała wszystkie przypadki. –

0
report.IncludeGroupFiltering = ShouldIncludeGroupFiltering(Request.QueryString["UseGroups"]) 

private boolean ShouldIncludeGroupFiltering(String queryString) { 
    return ("True" == queryString) 
} 
Powiązane problemy