if (Request.QueryString["UseGroups"] != null)
{
if (Request.QueryString["UseGroups"] == "True")
{
report.IncludeGroupFiltering = true;
}
else
{
report.IncludeGroupFiltering = false;
}
}
else
{
report.IncludeGroupFiltering = false;
}
Trả lời
Đơ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ó là 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 :)
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
. mã số cũng sẽ ném, do đó, hành vi sẽ giống nhau –
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
report.IncludeGroupFiltering = (Request.QueryString["UseGroups"] != null)
&& (Request.QueryString["UseGroups"] == "True");
Kiểm tra 'null' không cần thiết khi bạn so sánh các trường hợp' chuỗi' –
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";
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;
Đ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. –
Đú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
report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"
Có lẽ đây:
report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] == "True")
report.IncludeGroupFiltering = true;
report.IncludeGroupFiltering = "True" == Request.QueryString["UseGroups"];
if ("blue" == theSky) –
Đây là một hồi tưởng từ việc tránh lệnh gọi 'equals' trên' null' :) – thelost
gì về việc sử dụng TryParse:
bool includeGroupFiltering;
bool throwaway = Boolean.TryParse(Request.QueryString["UseGroups"], out includeGroupFiltering);
report.IncludeGroupFiltering = includeGroupFiltering;
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
@stack, bạn là chính xác, có nghĩa là để sử dụng một var throwaway. Đã cập nhật. –
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");
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");
Đâ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;
}
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).
'Request.QueryString [string]' trả về một chuỗi, mà làm cho hầu hết các tranh luận này. –
Đ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. –
report.IncludeGroupFiltering = ShouldIncludeGroupFiltering(Request.QueryString["UseGroups"])
private boolean ShouldIncludeGroupFiltering(String queryString) {
return ("True" == queryString)
}
- 1. Có ai có thể giảm 3 câu lệnh LINQ thành SQL này thành một không?
- 2. Tuyên bố ifelse lồng nhau
- 3. tsql: có thể thực hiện các câu lệnh lồng nhau trong một lựa chọn không?
- 4. Java Câu hỏi: Có thể có câu lệnh chuyển đổi trong một câu lệnh khác không?
- 5. Có thể sử dụng nhiều câu lệnh MySQL/lồng nhau không?
- 6. Tái cấu trúc câu lệnh forested lồng nhau
- 7. Có thể đưa ra 1 phương pháp chung trong hai câu lệnh linq này không?
- 8. Tôi có nên tránh lồng nhau nếu các câu lệnh trong Perl không?
- 9. Tôi có thể tạo các túi lồng nhau bằng cách sử dụng các câu lệnh FOREACH lồng nhau trong Pig Latin không?
- 10. Không nghĩ ra có 'gọi lại'?
- 11. Ai đó có thể lạm dụng LINQ và giải quyết câu đố tiền này không?
- 12. DTO có thể có DTO lồng nhau không?
- 13. Javascript "shift" so với "splice" - các câu lệnh này có bằng nhau không?
- 14. Không thể lồng vào câu lệnh exec chèn
- 15. Có thể tự động diễn ra một thuộc tính lồng nhau với Utons Bean Utils không?
- 16. Các câu lệnh thử lồng nhau trong python?
- 17. Ai đó có thể Giải thích mã java này
- 18. Thay thế Nếu Khác câu lệnh lồng nhau có điều kiện duy nhất
- 19. Thanh lịch xử lý các giá trị trống trong một giá trị băm lồng nhau
- 20. Nest Loops, không thể tìm ra cách để mã này
- 21. Có trang tổng thể lồng nhau trong ASP.NET MVC không?
- 22. Câu lệnh C# có thể được viết mà không có dấu ngoặc nhọn không?
- 23. Có thể đường ống vào câu lệnh if không?
- 24. đệ quy lẫn nhau - ai đó có thể giúp giải thích cách mã này hoạt động?
- 25. Câu lệnh kiểu có phạm vi có thể không?
- 26. Tập lệnh python có thể liên tục thay đổi biến môi trường Windows không? (thanh lịch)
- 27. Tìm mã làm đẹp Java (hoặc có thể không đẹp, nhưng một cái gì đó để làm cho mã thanh lịch hơn)
- 28. Có thực hành xấu để lồng 2 câu lệnh bắt trong C# không?
- 29. Làm cách nào để dọn dẹp quá nhiều câu lệnh nếu có thể đọc được
- 30. Con trỏ "này" trong hàm lồng nhau
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; –
@Ed, anh ấy không làm nếu (cái gì == đúng), anh ấy làm nếu (cái gì ==" Đúng "). –