Toán tử ba ngôi (?:) là toán tử điều kiện duy nhất trong C# nhận 3 toán hạng: condition ? trueExpression : falseExpression. Trả về giá trị của biểu thức đúng hoặc sai.
Cú pháp
condition ? exprTrue : exprFalse
condition: Biểu thức boolean.exprTrue: Giá trị trả về nếu condition = true.exprFalse: Giá trị trả về nếu condition = false.- Hai biểu thức phải cùng kiểu hoặc có chuyển đổi ngầm.
Ví dụ cơ bản
using System;
class Program
{
static void Main()
{
int a = 10;
int b = (a == 1) ? 20 : 30; // false → 30
Console.WriteLine($"b = {b}"); // 30
b = (a == 10) ? 20 : 30; // true → 20
Console.WriteLine($"b = {b}"); // 20
// Lồng nhau (nested ternary) - NÊN TRÁNH
int max = (a > 5) ? (a > 15 ? a : 15) : 5;
Console.WriteLine($"max = {max}");
}
}
Kết quả
b = 30 b = 20 max = 15
Các trường hợp dùng hay
1. Gán giá trị mặc định (Null coalescing ??: tốt hơn cho null)
string name = input ?? "Guest"; // Null-coalescing (C# 2.0+) string name2 = input != null ? input : "Guest"; // Ternary tương đương
2. Điều kiện trong expression (expression-bodied members)
public string Status => isActive ? "Active" : "Inactive"; public int Max(int a, int b) => a > b ? a : b;
3. Format chuỗi có điều kiện
Console.WriteLine($"Bạn {(age >= 18 ? "được" : "KHÔNG được")} bầu cử");
Lưu ý quan trọng
- Không phải statement: Không thể dùng như
ifđơn độc. Phải gán hoặc return. - Type compatibility: Hai nhánh phải cùng kiểu hoặc có implicit conversion.
- Độ ưu tiên thấp: Cần ngoặc khi kết hợp:
result = (cond ? a : b) + c;. - Không lồng sâu: Khó đọc. Dùng
if/elsehoặcswitch expression(C# 8+).
Switch Expression (C# 8+) - Thay thế ternary lồng
// Thay vì: x > 0 ? "Positive" : x < 0 ? "Negative" : "Zero"
string sign = x switch
{
> 0 => "Positive",
< 0 => "Negative",
_ => "Zero"
};
So sánh với if-else
| Đặc điểm | Ternary (?:) | if-else |
|---|---|---|
| Là expression | Có (trả về giá trị) | Không (statement) |
| Gán biến inline | Dễ dàng | Cần block |
| Đọc hiểu | Đơn giản: OK. Phức tạp: Khó | Rõ ràng cho logic phức tạp |
| Debug | Khó breakpoint nhánh | Dễ dàng |
Quy tắc: Dùng ternary cho logic đơn giản, gán giá trị. Dùng if-else/switch cho logic phức tạp, side effects, nhiều câu lệnh.