2012-07-06 28 views
43

Nếu tôi có tuyên bố If với 2 điều kiện - và lần đầu tiên không thành công, điều kiện thứ 2 sẽ được xem xét hoặc sẽ chuyển thẳng đến else? Vì vậy, trong ví dụ sau, nếu myList.Count == 0, sẽ myString được so sánh với "giá trị" hay nó sẽ chỉ thẳng đến else?Câu lệnh IF có dừng đánh giá nếu nó không đạt được điều kiện đầu tiên không?

if(myList.Count > 0 && myString.Equals("value")) 
{ 
//Do something 
} 
else 
{ 
//Do something else 
} 
+7

* Toán tử logic * * trong C# là "đoản mạch". Ở đó, rất nhiều từ khóa. –

+1

Lưu ý rằng nó không phải là câu lệnh 'if' đang làm điều này, nó là thuộc tính của toán tử logic AND và OR. – unwind

Trả lời

67

Nó sẽ ngừng đánh giá vì bạn đang sử dụng ký hiệu đôi và & &. Điều này được gọi là short-circuiting.

Nếu bạn đã thay đổi nó vào một dấu và duy nhất:

if(myList.Count > 0 & myString.Equals("value")) 

nó sẽ đánh giá cả hai.

+0

Cảm ơn rất nhiều Paul, +1. Khi nào bạn thực sự muốn sử dụng toán tử & sau đó (tức là khi nào bạn thậm chí muốn xem thứ 2 nếu điều kiện thứ nhất là sai)? –

+4

Trong tình huống này, bạn chắc chắn sẽ không. Bạn có thể sử dụng nó nếu điều kiện thứ hai của bạn là một cuộc gọi hàm thực hiện một số cập nhật mà bạn muốn xảy ra bất kể (nhưng tôi không biết tại sao bạn muốn làm điều đó). –

+1

@DeeMac Hãy xem xét mã: 'public bool DoAllWork() {return DoWork() & DoExtraWork(); } 'Vì chúng ta sử dụng một' & 'công việc phụ sẽ được thực hiện ngay cả khi gọi phương thức đầu tiên (' DoWork() ') trả về' false'. Chúng ta đã sử dụng '&&' thay vào đó, công việc phụ sẽ chỉ được thực hiện nếu cuộc gọi đầu tiên trả về 'true'. Nhưng hầu hết các lập trình viên không bao giờ sử dụng toán tử '&' với boolean, tôi đoán vậy. Với các kiểu số nguyên (giữ nhiều thông tin hơn 1 bit), đó là một câu chuyện khác. –

16

Không, nó sẽ không được xem xét. (Điều này được gọi là short circuiting.)

Trình biên dịch đủ thông minh (và yêu cầu theo đặc tả ngôn ngữ) để biết rằng nếu điều kiện đầu tiên là false, không có cách nào để biểu đạt sẽ đánh giá true.

Và khi Jacob chỉ cho ||, khi điều kiện đầu tiên là true, điều kiện thứ hai sẽ không được đánh giá.

+2

Và ngược lại với || - tùy chọn thứ hai sẽ không được đánh giá nếu tùy chọn đầu tiên là 'true'. –

+0

Tôi cập nhật câu trả lời để phản ánh nhận xét của @JacobRaihle. – MBen

3

Không, điều kiện thứ hai sẽ bị bỏ qua nếu bạn sử dụng &&,

Nếu bạn sử dụng & nó sẽ được coi

+0

Ah đúng, không nhận ra rằng ngay cả một nhà điều hành phải trung thực. –

1

Trong ví dụ của bạn, báo cáo kết quả thứ hai sẽ chỉ được đánh giá nếu là người đầu tiên thất bại. Logic và && sẽ chỉ trả lại true khi cả hai toán hạng đều đúng, còn gọi là đánh giá ngắn mạch.

7

Nếu toán tử logic là AND (& &) thì câu lệnh IF sẽ đánh giá biểu thức đầu tiên - nếu câu đầu tiên là sai, nó sẽ không đánh giá thứ hai. Điều này rất hữu ích để kiểm tra nếu biến là null trước khi gọi phương thức trên tham chiếu - để tránh ngoại lệ con trỏ null

Nếu toán tử logic là OR (||) thì câu lệnh IF sẽ đánh giá biểu thức đầu tiên - nếu câu đầu tiên là đúng, nó sẽ không đánh giá thứ hai.

Trình biên dịch và runtimes được tối ưu hóa cho hành vi này

1

NET hỗ trợ short circuiting nên khi điều kiện đầu tiên đi thất bại, nó sẽ không kiểm tra condtion thứ hai .... Trong C# || và & & là các phiên bản ngắn mạch của các toán tử logic | và & tương ứng .... Nó thường là nhanh quá ...

2

Xem xét folowing:

static int? x; 
static int? y; 

static void Main(string[] args) 
{ 
    x = 5; 
    if (testx() & testy()) 
    { 
     Console.WriteLine("test"); 
    } 
} 

static Boolean testx() 
{ 
    return x == 3; 
} 

static Boolean testy() 
{ 
    return y == 10; 
} 

Nếu bạn theo dõi thông qua chức năng cả testx và cáu kỉnh được evaulated mặc dù testx là sai.

Nếu bạn thay đổi thử nghiệm thành & & chỉ lần đầu tiên được kiểm tra.

0

Biểu thức sẽ được đánh giá từ trái sang phải vì nó là một phép toán logic và logic. Nếu sai, nó sẽ ngừng đánh giá. Nó cũng có quyền ưu tiên cao nhất của các hoạt động trong biểu thức của bạn.

Các điều kiện-AND (& &) thực hiện một logic AND của toán hạng bool của nó, nhưng chỉ đánh giá toán hạng thứ hai của nó nếu cần thiết. Conditional And Operator (&&) MSDN

Đây là bộ sections listing the C# operators starting with the highest precedence to the lowest.

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