Điều này được đề cập khá nhiều bởi các câu trả lời khác, nhưng "đó là một biểu thức" không thực sự giải thích tại sao điều đó lại hữu ích ...
Trong các ngôn ngữ như C ++ và C #, bạn có thể xác định các trường chỉ đọc cục bộ (trong thân phương thức) bằng cách sử dụng chúng. Điều này không thể xảy ra với câu lệnh if / then thông thường vì giá trị của trường chỉ đọc phải được gán trong câu lệnh đơn đó:
readonly int speed = (shiftKeyDown) ? 10 : 1;
không giống như:
readonly int speed;
if (shifKeyDown)
speed = 10; // error - can't assign to a readonly
else
speed = 1; // error
Theo cách tương tự, bạn có thể nhúng một biểu thức bậc ba vào mã khác. Ngoài việc làm cho mã nguồn nhỏ gọn hơn (và trong một số trường hợp, kết quả là dễ đọc hơn), nó cũng có thể làm cho mã máy được tạo nhỏ gọn và hiệu quả hơn:
MoveCar((shiftKeyDown) ? 10 : 1);
... có thể tạo ra ít mã hơn so với việc phải gọi cùng một phương thức hai lần:
if (shiftKeyDown)
MoveCar(10);
else
MoveCar(1);
Tất nhiên, nó cũng là một biểu mẫu ngắn gọn và tiện lợi hơn (ít nhập hơn, ít lặp lại hơn và có thể giảm nguy cơ lỗi nếu bạn phải sao chép các đoạn mã trong if / else). Trong các trường hợp "kiểu chung" rõ ràng như thế này:
object thing = (reference == null) ? null : reference.Thing;
... nó chỉ đơn giản là đọc / phân tích cú pháp / hiểu (khi bạn đã quen với nó) nhanh hơn so với if / else dài dòng tương đương, vì vậy nó có thể giúp bạn 'mò' mã nhanh hơn.
Tất nhiên, chỉ vì nó hữu ích không có nghĩa là nó là thứ tốt nhất để sử dụng trong mọi trường hợp. Tôi khuyên chỉ nên sử dụng nó cho các đoạn mã ngắn mà ý nghĩa rõ ràng (hoặc rõ ràng hơn) bằng cách sử dụng ?:
- nếu bạn sử dụng nó trong mã phức tạp hơn hoặc lồng các toán tử bậc ba vào nhau, nó có thể khiến mã khó đọc một cách khủng khiếp .