Cả hai đều là toán tử OR logic, nhưng khác biệt về cơ chế đánh giá (evaluation).
| (Bitwise OR / Logical OR không short-circuit)
- Đánh giá CẢ HAI vế (eager evaluation).
- Trả về
truenếu ít nhất một vế true. - Dùng cho: bitwise operation trên số nguyên, hoặc logic khi cần đánh giá cả hai vế (side effects).
|| (Conditional Logical OR / Short-circuiting OR)
- Đánh giá SHORT-CIRCUIT: Nếu vế trái true -> không đánh giá vế phải.
- Trả về
truenếu ít nhất một vế true. - Dùng cho: Logic điều kiện thông thường (performance, tránh null reference).
Ví dụ 1: Bitwise OR trên số nguyên
int a = 4; // 100 (binary)
int b = 3; // 011
int c = a | b; // 111 = 7
Console.WriteLine(c); // 7
Ví dụ 2: Short-circuit behavior
bool GetTrue()
{
Console.WriteLine("GetTrue called");
return true;
}
bool GetFalse()
{
Console.WriteLine("GetFalse called");
return false;
}
// || (Short-circuit)
Console.WriteLine("=== || ===");
if (GetTrue() || GetFalse())
Console.WriteLine("Result: True");
// Output:
// GetTrue called
// Result: True
// (GetFalse KHÔNG được gọi)
// | (No short-circuit)
Console.WriteLine("=== | ===");
if (GetTrue() | GetFalse())
Console.WriteLine("Result: True");
// Output:
// GetTrue called
// GetFalse called
// Result: True
Ứng dụng thực tế của | (Non-short-circuit)
// Cần gọi CẢ HAI hàm để side effect (logging, validation, state change)
bool validated = ValidateInput() | ValidateBusinessRules() | SaveToDatabase();
// Tất cả 3 đều chạy dù kết quả như thế nào
// Hoặc bitwise flags
[Flags]
enum Permissions { None=0, Read=1, Write=2, Execute=4 }
Permissions p = Permissions.Read | Permissions.Write; // 3
Ứng dụng thực tế của || (Short-circuit)
// Null check an toàn (null-conditional pattern trước C# 6)
string name = null;
if (name != null && name.Length > 0) // || không dùng được ở đây
Console.WriteLine(name);
// Hoặc
if (user == null || !user.IsActive) return; // Nếu user null, không check IsActive
// Lazy evaluation
if (Cache.Exists(key) || ComputeExpensiveValue()) // Chỉ compute nếu cache miss
UseValue();
Bảng tóm tắt
| Đặc điểm | | | || |
|---|---|---|
| Đánh giá vế phải | Luôn | Chỉ khi vế trái false |
| Bitwise operation | Có | Không |
| Performance (logic) | Chậm hơn | Nhanh hơn (short-circuit) |
| Side effects | Cả hai đều chạy | Vế phải có thể không chạy |
| Nullable bool | Hỗ trợ (lifted) | Không hỗ trợ trực tiếp |
Best Practice: Mặc định dùng || cho logic boolean. Chỉ dùng | khi cần bitwise hoặc bắt buộc đánh giá cả hai vế.