2010-09-10 62 views
10
bool foo = true; 

// Do this? 
if (foo) 
{ 
} 

// Or this? 
if (foo == true) 
{ 
} 

Tôi thích một trong số họ và đồng nghiệp của tôi. Kết quả là như nhau, nhưng (chính xác hơn) là gì?Kiểm tra xem boolean có đúng không?

+0

Đó là một vấn đề của phong cách. Tôi nghi ngờ bạn sẽ nhận được một câu trả lời dứt khoát về điều này. – Robaticus

+0

Tôi ước tôi có thể bỏ phiếu để đóng chung. Có waaaaaaay quá nhiều câu hỏi về điều này và tất cả họ đều chủ quan như nhau. – BoltClock

+11

Jon Skeet thích cái đầu tiên. Vì vậy, đó là cách chính xác ... kết thúc cuộc thảo luận! ;-) –

Trả lời

33

Hầu như tất cả mọi người tôi đã nhìn thấy đưa ra ý kiến ​​thích

if (foo) 
{ 
} 

Thật vậy, tôi đã nhìn thấy nhiều người chỉ trích việc so sánh rõ ràng, và tôi thậm chí có thể đã làm như vậy bản thân mình trước khi bây giờ. Tôi muốn nói kiểu "ngắn" là thành ngữ.

EDIT:

Lưu ý rằng điều này không có nghĩa là dòng mã luôn không chính xác. Xem xét:

bool? maybeFoo = GetSomeNullableBooleanValue(); 
if (maybeFoo == true) 
{ 
    ... 
} 

Điều đó sẽ biên dịch, nhưng không có "== true" nó sẽ không, như không có chuyển đổi ngầm từ bool? để bool.

+3

Đồng ý. Thời gian duy nhất tôi muốn sử dụng tiết (foo == true) là nếu tên biến foo không rõ ràng là một boolean, chỉ để dễ đọc. –

+0

+1 cho nhận xét 'bool? '. Tôi đã và đang sử dụng '(có lẽFoo.HasValue && mayFoo.Value)' nhưng 'mayFoo == true' là đẹp hơn nhiều. – fredw

+1

@fredw: Một tùy chọn khác là thêm giá trị "mặc định": 'if (mayFoo ?? false)' hoặc 'if (mayFoo ?? true)'. Nhưng tôi thích '==' nói chung. –

23

Tùy thuộc vào hoàn cảnh của bạn.

Tôi xin nói, nếu bool bạn có một cái tên tốt, sau đó:

if (control.IsEnabled) // Read "If control is enabled." 
{ 
} 

sẽ được ưa thích.

Nếu, tuy nhiên, biến có tên không rõ ràng, việc kiểm tra đối với true sẽ rất hữu ích trong việc hiểu logic.

if (first == true) // Read "If first is true." 
{ 
} 
+10

Khả năng đọc +1 nên hướng dẫn câu trả lời - lý tưởng là bạn sẽ đổi tên biến để bạn có thể sử dụng biến trước đó. – RedFilter

+23

Nếu tên không rõ ràng, có lẽ tên phải được đổi tên ... –

+0

Khi xử lý các hệ thống nhúng, thường bạn cần kiểm tra trạng thái của một bit. Trong C# nó là hoàn toàn hợp lý để lưu trữ bit như một boolean. Trong trường hợp đó, kiểm tra xem boolean là true có thể cung cấp mức độ dễ đọc hơn là đổi tên biến. Ví dụ, hãy xem xét một chút cho biết dữ liệu có nên là đầu vào hay đầu ra hay không. Bạn có thể đặt tên biến là 'IsOutputBit', nhưng nó có lẽ dễ đọc hơn với tên là' IODirection'. Tôi thừa nhận, nó có thể tốt hơn để tạo ra một giá trị 2 enum cho các mục đích này. –

3

Ví dụ đầu tiên gần như luôn luôn thắng trong cuốn sách của tôi:

if(foo) 
{ 
} 

Đó là ngắn hơn và ngắn gọn hơn. Tại sao thêm một kiểm tra thêm vào một cái gì đó khi nó hoàn toàn không cần thiết? Chỉ cần lãng phí các chu kỳ ...

Tôi đồng ý rằng đôi khi cú pháp chi tiết hơn làm cho mọi thứ dễ đọc hơn (điều cuối cùng quan trọng hơn miễn là hiệu suất có thể chấp nhận được) trong trường hợp các biến được đặt tên kém.

2

Cả hai đều chính xác.

Bạn có thể có một số tiêu chuẩn mã hóa trong công ty của mình - chỉ cần xem theo dõi thông qua. Nếu bạn không có - bạn nên :)

+4

Một tiêu chuẩn mã hóa mà lập pháp các công cụ như thế này là một "tổ chức mùi" –

+2

Tiêu chuẩn mã hóa với mức độ quản lý vi mô này làm phiền tôi. – RedFilter

+1

@Steve Townsend: Mặt khác, mười kiểu mã hóa khác nhau trong một tệp là "(dis) tổ chức hôi thối" và khó đọc. – Piskvor

1

cá nhân tôi muốn

if(true == foo) 
{ 
} 

không có cơ hội cho ==/= nhập nhầm và tôi thấy nó biểu cảm hơn về loại foo của. Nhưng đó là một câu hỏi rất chủ quan.

+0

Nhưng đây là C# và 'if (foo = true)' sẽ tạo ra một lỗi thời gian biên dịch. – ChrisF

+3

@ChrisF: Không, không. Kết quả của "foo = true" vẫn là một bool, vì vậy nó là tốt cho điều kiện "if". Nó * không * tạo ra một cảnh báo trong trình biên dịch MS, tuy nhiên. –

+1

Tại sao dừng lại ở đây khi bạn có thể làm "if (true == (true == (true == foo)))"? Điều này sẽ không diễn tả nhiều hơn? ;) – Henrik

0

Không phải là "chính xác hơn". Sở thích cá nhân của tôi là cho hình thức ngắn gọn hơn nhưng một trong hai là tốt. Đối với tôi, cuộc sống quá ngắn ngủi để có thể nghĩ đến việc tranh cãi về những thứ như thế này.

11

Nếu bạn đang đi để lựa chọn

if(foo == true) 

tại sao không đi tất cả các cách và làm

if(foo == true == true == true == true == true == true == true == true == true) 

Đó là điều tương tự.

Tôi không đồng ý rằng nếu tên được đặt tên rõ ràng (ví dụ: IsSomething) thì không sao để so sánh với đúng, nhưng nếu không bạn nên làm như vậy. Nếu nó trong một tuyên bố nếu rõ ràng nó có thể được so sánh với sự thật.

if(monday) 

là giống như mô tả như

if(monday == true) 

Tôi cũng thích cùng một tiêu chuẩn cho không:

if(!monday) 

như trái ngược với

if(monday == false) 
Các vấn đề liên quan