Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Khác biệt giữa toán tử | và || trong C#

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ề true nế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ề true nế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ảiLuônChỉ khi vế trái false
Bitwise operationCóKhông
Performance (logic)Chậm hơnNhanh hơn (short-circuit)
Side effectsCả hai đều chạyVế phải có thể không chạy
Nullable boolHỗ 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ế.