2012-02-05 30 views

Trả lời

10

Tại sao dễ dàng; nghĩ về những gì bạn đã viết như trên thực tế là điều này:

object o = null; 
Console.WriteLine(("Is null: " + o) == null); // returns false 

Đó là thử nghiệm "Is null: " + o chống null, mà sẽ luôn luôn được false. Điều này là do các quy tắc về quyền ưu tiên của toán tử, trong đó + xuất hiện trước ==.

Bạn nên áp dụng một cách rõ ràng dấu ngoặc để đảm bảo nó hoạt động như bạn muốn:

Console.WriteLine("Is null: " + (o == null)); // returns true 

Như đã đề cập trong các ý kiến ​​của Jim Rhodes:

Đây là một trong nhiều lý do tại sao bạn luôn luôn nên sử dụng dấu ngoặc đơn và không bao giờ dựa vào các quy tắc ưu tiên trình biên dịch.

Tôi tự lưu ý rằng tôi đồng ý; thậm chí tôi không tự mình thử tự mình để tự mình nhớ quy tắc ưu tiên của nhà điều hành, thay vào đó, hãy luôn rõ ràng với mọi lần. Tôi cũng đề nghị rằng đây cũng là một lý do rất cẩn thận khi dựa vào việc chuyển đổi loại và/hoặc phương thức ngầm định với nhiều tình trạng quá tải.

Tôi cũng muốn chỉ ra rằng tôi thực sự thích một cái gì đó Ravadre được ghi chú trong their answer; về lý do tại sao chỉ có "False" được in, chứ không phải toàn bộ văn bản bạn đang cố in.

+3

Đây là một trong nhiều lý do tại sao bạn nên sử dụng dấu ngoặc đơn và không bao giờ dựa vào quy tắc ưu tiên trình biên dịch. –

+1

@JimRhodes Thật vậy; Tôi thậm chí không cố gắng nhớ quy tắc ưu tiên của nhà điều hành. Nếu nó có thể * có thể * là một vấn đề, tôi chỉ rõ ràng ưu tiên trong mã của tôi. Ví dụ này là * cũng * một trường hợp cho thấy nơi dựa vào chuyển đổi loại rõ ràng có thể gây nhầm lẫn. –

11

Ưu tiên toán tử.

Hãy thử

Console.WriteLine("Is null: " + (o == null)); 

Trong code của bạn, First o được thêm vào "Is null: " chuỗi, mà sau đó được kiểm tra nếu nó là null. Tất nhiên nó không phải là, vì vậy nó được đánh giá là sai. Cuộc gọi của bạn giống như khi bạn chỉ viết

Console.WriteLine(false.ToString()); 

Đây là lý do tại sao chỉ "False" được in, ngay cả khi không có chuỗi của bạn.

+0

Ngoài ra, hãy chú ý đến cách nó chỉ hiển thị "False" và không phải là "null: False" –

8

Các câu trả lời khác đã chẩn đoán chính xác vấn đề: ưu tiên toán tử cao hơn cho kết nối so với bình đẳng. Tuy nhiên, điều không ai có thể giải quyết được là lỗi cơ bản hơn trong chương trình của bạn, đó là bạn đang làm việc liên kết. Cách tốt hơn để viết mã là:

Console.WriteLine("is null: {0}", obj == null); 

Hiện tại, không thể xảy ra sự cố ưu tiên của toán tử vì biểu thức được đề cập chỉ có một toán tử duy nhất.

Nói chung, bạn nên tránh nối chuỗi và ưu tiên thay thế chuỗi, khi thực hiện đầu ra. Nó là dễ dàng hơn để làm cho nó đúng, nó là linh hoạt hơn nhiều, nó là dễ dàng hơn để bản địa hóa các chương trình được viết bằng cách sử dụng kỹ thuật này, và như vậy.

+0

Tuy nhiên, nếu nối không bao gồm các biểu thức (chỉ các biến, có thể là hằng số) và nó ngắn và đơn giản? Trong nhiều trường hợp nối ngắn hơn, rõ ràng hơn và nó hoạt động tốt hơn. Bạn nghĩ sao về những lập luận này? – Konstantin

Các vấn đề liên quan