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

Mã của bạn cho thấy rằng bạn thiếu hiểu biết về loại boolean. Bạn hiếm khi (nếu bao giờ) cần phải làm những việc như "If (something == true) somethingElse = true; –

+13

@Ed, anh ấy không làm nếu (cái gì == đúng), anh ấy làm nếu (cái gì ==" Đúng "). –

Trả lời

47

Đơn giản chỉ cần một tấm séc duy nhất:

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

Không cần để đánh giá Request.QueryString["UseGroups"] hai lần - nó chỉ có thể tương đương với "True" nếu nó không null, và so sánh sẽ hoạt động hoàn toàn tốt (và trả về false) nếu nó null.

Bất kỳ giải pháp nào vẫn thực hiện hai thao tác là các vấn đề quá phức tạp :)

+0

Công việc này, khi trình chỉ mục trả về null và không ném một ngoại lệ nếu không tìm thấy khóa đó – Will

+2

. mã số cũng sẽ ném, do đó, hành vi sẽ giống nhau –

+0

Ah, vì vậy Request.QueryString ["SomethingNotThere"] sẽ không ném một ngoại lệ tham chiếu đối tượng nếu tôi cố gắng so sánh nó? Tôi phải có nhầm lẫn hành vi của nó với của ViewData [ "NonDefined"] – BigOmega

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

Kiểm tra 'null' không cần thiết khi bạn so sánh các trường hợp' chuỗi' –

14

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

0

Bạn đang làm cơ bản theo cách tôi muốn. Chỉ cần loại bỏ các dư thừa bên trong khác:

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

Điều đó sẽ không thành công. Nếu UseGroups là không null, nhưng không phải "True" thì IncludeGroupFiltering sẽ không bao giờ được thiết lập. –

+0

Đúng. Tôi thường giả định rằng bool được đặt thành false và sau đó được cập nhật thành true -in trong trường hợp đó dòng cuối cùng cũng có thể bị bỏ đi. Có lẽ là một giả định không hợp lệ. – AllenG

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

Có lẽ đây:

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

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

+8

if ("blue" == theSky) –

+0

Đây là một hồi tưởng từ việc tránh lệnh gọi 'equals' trên' null' :) – thelost

0

gì về việc sử dụng TryParse:

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

Tôi chưa thực sự thử chạy mã đó, nhưng nó sẽ xuất hiện, trong khi ban đầu bạn có giá trị đúng hoặc sai được gán cho includeGroupFiltering, bạn sẽ ngay lập tức ghi đè nó bằng true/false cho biết liệu phân tích cú pháp đã thành công hay chưa. Do đó, bạn sẽ kết thúc với sự thật nếu bạn chuyển vào "true" * hoặc * "false". – stack

+0

@stack, bạn là chính xác, có nghĩa là để sử dụng một var throwaway. Đã cập nhật. –

1

Yếu tố ra Request.QueryString ["UseGroups"] một phần để làm e nó rõ ràng bạn muốn đề cập đến điều tương tự, và sau đó nó trở thành:

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

Tôi nghĩ Request.QueryString["UseGroups"] == "True" và "True" là một chuỗi duy nhất, nó không hành xử giống như bool. Vì vậy, bạn có thể viết trong một dòng

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

Đây là cách tôi làm điều này loại mã:

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

hằng chuỗi là không thay đổi và phun, họ cũng đang tham khảo các đối tượng. Tuy nhiên kết quả của Request.QueryString ["UserGroups"] là một tham chiếu chuỗi (hoặc tham chiếu đến một đối tượng có thể được chuyển đổi hoàn toàn thành chuỗi ...) có thể không được atomized, vì vậy bạn không thể so sánh các tham chiếu có thể được phân biệt, ngay cả khi các chuỗi được so sánh bằng nhau.

Toán tử == trên các cặp Strings không so sánh các tham chiếu mà là nội dung chuỗi. Điều này có nghĩa là Request.QueryString ["UserGroups"] sẽ bị hủy đăng ký và điều này có thể gây ra ngoại lệ dereference con trỏ null. Đó là lý do tại sao có một thử nghiệm trước cho null (vì các phép thử với "reference == null" KHÔNG được bỏ qua tham chiếu nhưng thực sự kiểm tra nếu nó là null hay không). Tuy nhiên, có một khả năng để tránh việc kiểm tra null: bạn có thể sử dụng toán tử === để so sánh tham chiếu, nếu kết quả của Request.QueryString ["Usergroups"] đã được tạo ra (nhưng nó có thể yêu cầu phân bổ và băm trong danh sách tĩnh của các nguyên tử, không phải là một ý tưởng tốt nếu QueryString là rất lớn.

Vì vậy, có, tốt nhất để làm là để bộ nhớ cache đầu tiên trên chuỗi truy vấn trong một biến chuỗi địa phương, và thực hiện hai bài kiểm tra:

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

Nhưng cho rằng các cơ quan của bạn nếu/else là chỉ để lưu trữ các kết quả của if() 's điều kiện, chỉ cần viết này:

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 

nhưng chỉ khi Request.QueryString [] nội dung đã được phun chuỗi, hoặc nếu chuyển đổi ngầm của họ đến chuỗi lại dây phun, tiết kiệm chuỗi so sánh và sử dụng === thay thế:

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

Tôi sẽ không đề xuất giả thiết nguy hiểm ở đây (có thể xảy ra kết quả truy vấn từ nguồn từ xa sẽ không bị lỗi, vì lý do bảo mật/bộ nhớ, trừ khi giá trị trả về đã được kiểm tra. Với mã của bạn, tôi nghi ngờ rằng điều này đang thực hiện xác thực trên các giá trị trả về từ truy vấn của bạn, vì vậy kết quả có thể không được phun nhiều nhất: nguyên nhân chính của mã của bạn là làm giả nội dung của Chuỗi truy vấn thành giá trị boolean chia sẻ. sau đó so sánh dễ dàng hơn nhiều.


Lưu ý: Tôi hoàn toàn không biết loại giá trị hoặc tham chiếu được trả về bởi Request.QueryString ["UserGroups"]. Nó có thể xảy ra rằng đây là một đối tượng thực hiện phương thức "bool operator == (string)", hoặc thậm chí trả về một kiểu khác với bool. Lưu trữ đối tượng trả về trong một biến chuỗi tuy nhiên sẽ thực hiện chuyển đổi của nó thành một chuỗi nếu kiểu của đối tượng không phải là null (và nếu đối tượng tương thích, nếu không bạn sẽ nhận được một ngoại lệ).

Bạn có thể muốn tránh chuyển đổi này của đối tượng không rõ, nếu đối tượng chính nó có thể so sánh với một chuỗi như "True", với mã như thế này:

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

Tất cả điều này phụ thuộc vào cách bạn tuyên bố QueryString [] mảng tài sản của đối tượng yêu cầu của bạn, và nếu các nội dung mảng có thể được đa hình (loại khác nhau). Nếu bạn biết cách khai báo, hãy sử dụng chính xác cùng loại để khai báo thanh ghi cuối cùng tạm thời ở trên, để tránh truy cập thành viên đôi vào QueryString khỏi Yêu cầu và lập chỉ mục kép của mảng QueryString. Ở đây, không thể biết mã nào sẽ là tốt nhất cho bạn vì chúng tôi không có tất cả các khai báo (C# thừa kế cùng độ phức tạp/không rõ ràng như C++, với quá nhiều chuyển đổi tiềm ẩn và lược đồ kế thừa phức tạp).

+1

'Request.QueryString [string]' trả về một chuỗi, mà làm cho hầu hết các tranh luận này. –

+0

Điều này là không thể xác định từ bài đăng của bạn. Câu trả lời của tôi là chính xác và bao gồm tất cả các trường hợp. –

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

private boolean ShouldIncludeGroupFiltering(String queryString) { 
    return ("True" == queryString) 
} 
Các vấn đề liên quan