|| gọi là logical OR operator và | gọi là bitwise logical OR nhưng khác biệt cơ bản nằm ở cách chúng được thực thi. Cú pháp cho || và | như sau:
- bool_exp1 || bool_exp2
- bool_exp1 | bool_exp2
- Cú pháp của 1 và 2 trông tương tự nhưng cách thực thi hoàn toàn khác nhau.
Logical OR (||) - Short-circuit
Trong statement đầu tiên, bool_exp1 sẽ được thực thi trước và kết quả của expression này quyết định việc thực thi statement khác.
- Nếu true, OR sẽ true nên không cần thực thi statement khác.
- Statement bool_exp2 chỉ được thực thi nếu và chỉ nếu bool_exp1 trả về false.
- Được gọi là short-circuit operator vì nó cắt ngắn circuit (statement) dựa trên kết quả expression đầu tiên.
Bitwise Logical OR (|) - Non short-circuit
Trong trường hợp của |, mọi thứ khác biệt. Compiler sẽ thực thi cả hai statements, nghĩa là cả hai statements đều được thực thi bất kể kết quả của statement nào.
- Đây là cách kém hiệu quả vì không cần thiết thực thi statement khác nếu cái đầu true vì kết quả OR chỉ effective khi cả hai false.
Ví dụ Logical OR (||)
using System;
namespace DemoApplication {
public class Program {
static void Main(string[] args) {
if (Condition1() || Condition2()) {
Console.WriteLine("Logical OR If Condition Executed");
}
Console.ReadLine();
}
static bool Condition1() {
Console.WriteLine("Condition 1 executed");
return true;
}
static bool Condition2() {
Console.WriteLine("Condition 2 executed");
return true;
}
}
}
Output
Condition 1 executed Logical OR If Condition Executed
Giải thích: Condition2() không được gọi vì Condition1() đã trả về true.
Ví dụ Bitwise Logical OR (|)
using System;
namespace DemoApplication {
public class Program {
static void Main(string[] args) {
if (Condition1() | Condition2()) {
Console.WriteLine("Bitwise OR If Condition Executed");
}
Console.ReadLine();
}
static bool Condition1() {
Console.WriteLine("Condition 1 executed");
return true;
}
static bool Condition2() {
Console.WriteLine("Condition 2 executed");
return true;
}
}
}
Output
Condition 1 executed Condition 2 executed Bitwise OR If Condition Executed
Giải thích: Cả Condition1() và Condition2() đều được gọi dù Condition1() đã true.
So sánh chi tiết
| Đặc điểm | || (Logical OR) | | (Bitwise OR) |
|---|---|---|
| Loại | Logical (boolean) | Bitwise (bit-level) / Logical non-short-circuit |
| Short-circuit | Có | Không |
| Performance | Tốt hơn (bỏ qua eval không cần) | Kém hơn (luôn eval cả hai) |
| Side effects | Method thứ 2 có thể không chạy | Cả hai method đều chạy |
| Dùng với | Boolean expressions | Boolean hoặc integer (bitwise) |
Khi nào dùng | (Bitwise OR)
- Thao tác bitwise trên integer:
int result = 5 | 3; // 7 (101 | 011 = 111) - Khi cần đảm bảo cả hai side effects đều xảy ra (ví dụ: validation functions phải chạy hết)
- Flag enums:
FileAccess.Read | FileAccess.Write
Best Practice
- Mặc định dùng || cho boolean logic (performance, predictable)
- Dùng | chỉ khi cần bitwise operations hoặc buộc evaluate cả hai
- Cẩn thận side effects trong condition:
if (Check() || Save())- Save() có thể không chạy