2011-12-21 31 views
5

Có sự khác biệt nào khi so sánh biến với null hoặc so sánh null với biến không?(a! = Null) hoặc (null! = A)

Ví dụ: so sánh nào tốt hơn (a != null) hoặc (null != a)? Tôi đã đọc ở đâu đó rằng thứ hai nhanh hơn nhưng không tìm thấy lý do cho việc này.

+5

Điều kiện Yoda FTW :) http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined (liên kết có thể truy cập tới 10k người dùng) –

Trả lời

25

Không, không cái nào nhanh hơn. Đó là một lời nói dối đơn giản. Không có lợi thế khi sử dụng phiên bản thứ hai. Chỉ làm cho khả năng đọc tồi tệ hơn.

này tất cả xuất phát từ C, nơi bạn có sai lầm có thể viết

if(x = 3) 

thay vì

if(x == 3) 

Một số người nghĩ rằng nó sẽ là tốt nhất để viết các hằng số đầu tiên, trong trường hợp nếu đó bạn đã viết = thay vì ==, bạn sẽ gặp lỗi trình biên dịch. Vì vậy, một số nguồn được đề xuất viết

if(3 == x) 

Một số người không biết tại sao điều này là cần thiết và tiến hành và khái quát ý tưởng này về cấu trúc và ngôn ngữ mà nó hoàn toàn không có ý nghĩa. IMO nó không có nhiều ý nghĩa trong bối cảnh C ban đầu, nhưng đó là vấn đề về sở thích cá nhân.

+0

+1 để được giải thích tốt đẹp. – Rudy

+0

Rất rõ ràng, cảm ơn! –

+0

Thực tế, có * là * chênh lệch tốc độ. Kiểm tra 'null == var' là một lệnh chậm hơn, bởi vì null phải được đẩy lên ngăn xếp. Không nhiều, nhưng cũng không giống nhau. – Bohemian

0

Không, không có sự khác biệt nào.

9

Thậm chí nếu có sự khác biệt về tốc độ, tôi cho rằng nó hoàn toàn không đáng kể trong 99,99% ứng dụng. Vì nó là, tôi sẽ không mong đợi có bất kỳ sự khác biệt tốc độ nào. Cá nhân tôi tìm thấy if (a != null) dễ đọc hơn - và khả năng đọc là nhiều hơn quan trọng hơn hiệu suất trong hầu hết các trường hợp.

+0

tôi cũng tìm thấy 'null! = A' dễ đọc hơn, vấn đề về thói quen có lẽ :-) – aishwarya

+4

@aishwarya: Một thói quen phát triển từ C hoặc C++? Nó có thể có ý nghĩa khi sử dụng so sánh theo cách đó để phòng thủ (mặc dù các trình biên dịch hiện đại nhận nhiệm vụ ngẫu nhiên, IIRC) nhưng tôi * tin rằng * hầu hết các nhà phát triển không có nền tảng, nơi có lợi ích rõ ràng tìm thấy biểu mẫu "biến đầu tiên" dễ đọc hơn. –

+0

@JonyAdamit bạn giành chiến thắng –

3

này thường được thực hiện để ngăn chặn tai nạn giao thay vì so sánh:

(a = null) //will not give error 

(null = a) //will give error 

tôi khá chắc chắn hiệu quả không phải là một lý do, và nếu nó là, một ưu sẽ làm cho mã giống nhau trong hệ nhị phân.

+1

Chúng tôi không thể phạm sai lầm này trong Java nhưng C/C++ –

+0

@ H3S Tôi không hiểu. –

+0

Ah! Tôi có nghĩa là cả hai báo cáo của bạn sẽ là lỗi do trình biên dịch java. 'if (a = null)' chỉ tốt trong một số trình biên dịch C/C++. –

0

không thực sự, không phải trong java bây giờ anyways. trong những ngày cũ, có thể là C, bạn có thể vô tình quên dấu chấm than và mã sẽ biên dịch tốt. về cơ bản, a = null sẽ được thực hiện dưới dạng một biểu thức được gán null thành a và luôn luôn đánh giá là đúng (vì chuyển nhượng đã thành công).

Trình biên dịch ngày nay mạnh mẽ hơn nhiều. Mặc dù, thói quen cũ chết cứng và tôi vẫn viết null != a :-)

+0

Xin lỗi vì đã quá muộn trong cuộc trò chuyện, nhưng nhận xét của bạn về "một biểu thức được gán null thành' a' và luôn đánh giá đúng (vì gán thành công) "là không chính xác. Nó đánh giá bất cứ giá trị nào của null là (vì vậy nó có thể sai nếu null là false). –

4

Bạn chỉ có thể muốn sử dụng chữ trước biến khi thực hiện thao tác với chuỗi.

if("abcd".equals(name)) không ném NPE ở đâu là if(name.equals("abcd")) sẽ làm gì nếu ở tất cả namenull.

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