Bài 3.4. Toán tử ba ngôi
📋 Nội dung bài học
- Giới thiệu về Toán tử Ba ngôi
- Cú pháp và cách sử dụng
- So sánh với câu lệnh If-Else
- Ứng dụng thực tế
- Lưu ý và mẹo sử dụng
- Ví dụ tổng hợp
- Bài tập thực hành
1. 📖 Giới thiệu về Toán tử Ba ngôi
Toán tử Ba ngôi (Ternary Operator) trong C# là một cách viết ngắn gọn để thay thế câu lệnh if-else
đơn giản. Nó được sử dụng để gán giá trị hoặc trả về kết quả dựa trên một điều kiện, giúp mã ngắn gọn và dễ đọc hơn trong một số trường hợp.
1.1. 📄 Đặc điểm chính
- Cú pháp ngắn gọn: Thay thế câu lệnh
if-else
bằng một dòng duy nhất. - Điều kiện đơn giản: Phù hợp với các biểu thức điều kiện trả về hai giá trị.
- Kết quả trả về: Luôn trả về một giá trị, thường được dùng để gán hoặc truyền vào hàm.
- Hiệu quả: Giảm số dòng mã, nhưng cần cẩn thận để tránh làm mã khó đọc.
1.2. 🎯 Mục đích
- Tăng tính ngắn gọn và rõ ràng cho mã.
- Thay thế các câu lệnh
if-else
đơn giản trong các tình huống như gán giá trị hoặc trả về kết quả. - Cải thiện khả năng bảo trì mã khi sử dụng đúng cách.
2. 🔍 Cú pháp và cách sử dụng
Toán tử Ba ngôi có cú pháp như sau:
condition ? valueIfTrue : valueIfFalse;
- condition: Biểu thức điều kiện trả về giá trị
true
hoặcfalse
. - valueIfTrue: Giá trị hoặc biểu thức được trả về nếu điều kiện là
true
. - valueIfFalse: Giá trị hoặc biểu thức được trả về nếu điều kiện là
false
.
2.1. 📅 Ví dụ cơ bản
int number = 15;
string parity = number % 2 == 0 ? "Even" : "Odd";
Console.WriteLine(parity); // Output: Odd
Giải thích:
- number % 2 == 0: Điều kiện kiểm tra số chẵn.
- “Even”: Giá trị trả về nếu điều kiện
true
. - “Odd”: Giá trị trả về nếu điều kiện
false
. - Kết quả: Biến
parity
được gán giá trị"Odd"
.
2.2. 🕙 Sử dụng trong biểu thức
double temperature = 22.5;
string comfort = temperature > 20 ? "Comfortable" : "Cold";
Console.WriteLine(comfort); // Output: Comfortable
Giải thích:
- temperature > 20: Kiểm tra nhiệt độ.
- “Comfortable”: Trả về nếu nhiệt độ trên 20.
- “Cold”: Trả về nếu nhiệt độ bằng hoặc dưới 20.
3. ⚖️ So sánh với câu lệnh If-Else
Toán tử Ba ngôi có thể thay thế các câu lệnh if-else
đơn giản, nhưng không phù hợp với các logic phức tạp.
3.1. 📅 Ví dụ với If-Else
int score = 75;
string grade;
if (score >= 60)
{
grade = "Pass";
}
else
{
grade = "Fail";
}
Console.WriteLine(grade); // Output: Pass
3.2. 🕙 Tương đương với Toán tử Ba ngôi
int score = 75;
string grade = score >= 60 ? "Pass" : "Fail";
Console.WriteLine(grade); // Output: Pass
So sánh:
- If-Else: Dễ đọc hơn với logic phức tạp, nhưng dài dòng hơn.
- Toán tử Ba ngôi: Ngắn gọn, phù hợp với gán giá trị đơn giản, nhưng có thể khó đọc nếu lạm dụng.
4. 📋 Ứng dụng thực tế
Toán tử Ba ngôi thường được sử dụng trong các trường hợp sau:
- Gán giá trị dựa trên điều kiện.
- Trả về giá trị trong phương thức.
- Xử lý logic đơn giản trong các chương trình console.
4.1. ⏱ Gán giá trị động
bool isRaining = true;
string activity = isRaining ? "Stay indoors" : "Go outside";
Console.WriteLine(activity); // Output: Stay indoors
4.2. 🕗 Trả về giá trị trong phương thức
public string GetPassStatus(int score)
{
return score >= 60 ? "Pass" : "Fail";
}
4.3. 📅 Kết hợp với mảng
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int num in numbers)
{
string type = num % 2 == 0 ? "Even" : "Odd";
Console.WriteLine($"{num} is {type}");
}
// Output:
// 1 is Odd
// 2 is Even
// 3 is Odd
// 4 is Even
// 5 is Odd
Giải thích: Sử dụng Toán tử Ba ngôi để phân loại số trong mảng.
5. ⚠️ Lưu ý và mẹo sử dụng
5.1. ✅ Hiệu quả
- Ngắn gọn: Sử dụng khi cần gán giá trị hoặc trả về kết quả dựa trên điều kiện đơn giản.
- Kết hợp với biểu thức: Thích hợp trong các biểu thức inline hoặc vòng lặp.
5.2. 🚫 Tránh sai lầm phổ biến
- Lạm dụng: Tránh sử dụng Toán tử Ba ngôi cho logic phức tạp hoặc lồng ghép nhiều cấp, vì sẽ làm mã khó đọc.
// Không nên: string result = x > 0 ? y > 0 ? "Both positive" : "Y negative" : z > 0 ? "X negative, Z positive" : "All negative";
- Kiểu dữ liệu không khớp: Đảm bảo
valueIfTrue
vàvalueIfFalse
có cùng kiểu dữ liệu. - Sử dụng không cần thiết: Chỉ dùng khi thực sự giúp mã ngắn gọn và dễ hiểu.
5.3. 🛡️ Trải nghiệm lập trình
- Dễ đọc: Sử dụng Toán tử Ba ngôi khi mã vẫn rõ ràng và dễ hiểu.
- Kiểm tra lỗi: Đảm bảo điều kiện và giá trị trả về hợp lệ để tránh lỗi runtime.
6. 📖 Ví dụ tổng hợp
Ví dụ tổng hợp sử dụng Toán tử Ba ngôi để xây dựng một chương trình console phân loại học sinh dựa trên điểm số:
using System;
namespace TernaryOperatorDemo
{
class Program
{
static void Main(string[] args)
{
Console.Write("Enter student's score (0-100): ");
if (int.TryParse(Console.ReadLine(), out int score) && score >= 0 && score <= 100)
{
// Xếp loại học sinh
string grade = score >= 90 ? "Excellent" :
score >= 70 ? "Good" :
score >= 50 ? "Average" : "Fail";
Console.WriteLine($"Grade: {grade}");
// Kiểm tra điều kiện thi lại
string retake = score < 50 ? "Must retake" : "No retake needed";
Console.WriteLine($"Retake: {retake}");
// Tính điểm thưởng
int bonus = score >= 80 ? 5 : 0;
Console.WriteLine($"Bonus points: {bonus}");
}
else
{
Console.WriteLine("Invalid score. Please enter a number between 0 and 100.");
}
}
}
}
Giải thích:
- grade: Phân loại học sinh dựa trên điểm số với Toán tử Ba ngôi lồng nhau.
- retake: Kiểm tra xem học sinh có cần thi lại hay không.
- bonus: Gán điểm thưởng nếu điểm số từ 80 trở lên.
- Kết quả: Chương trình hiển thị xếp loại, trạng thái thi lại, và điểm thưởng dựa trên điểm nhập vào.
Code mẫu trong video:
namespace TernaryOperatorDemo
{
class Program
{
static void Main()
{
// viết chương trình phân loại học lực của học sinh dựa trên điểm số x hệ 100.
// quy ước:
// x >= 90: xuất sắc
// 90 > x >= 70: giỏi
// 70 > x >= 50: trung bình
// x < 50: trượt môn, thi lại
// x >= 80: được thưởng thêm 5 điểm
Console.InputEncoding = System.Text.Encoding.UTF8;
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine("Nhập điểm của học sinh(0-100):");
var score = 0;
int.TryParse(Console.ReadLine(), out score);
if (score >= 0 && score <= 100)
{
// Xếp loại học lực
var grade = score >= 90 ? "Xuất sắc" :
score >= 70 ? "Giỏi" :
score >= 50 ? "Trung bình" : "Trượt môn";
Console.WriteLine($"Điểm số: {score}, Học lực: {grade}");
// Kiểm tra thi lại
var retake = score < 50 ? "Phải học lại" : "Không phải học lại.";
Console.WriteLine($"Trạng thái học lại: {retake}");
// Tính điểm thưởng
var bonus = score >= 80 ? 5 : 0;
Console.WriteLine($"Điểm thưởng: {bonus}");
} else
{
Console.WriteLine("Điểm không hợp lệ, vui lòng nhập điểm trong đoạn 0-100.");
}
}
}
}
Nhập điểm của học sinh(0-100):
90
Điểm số: 90, Học lực: Xuất sắc
Trạng thái học lại: Không phải học lại.
Điểm thưởng: 5
7. 🛠 Bài tập thực hành
- Tải đề bài đầy đủ: nhấn vào đây
- Bài giải mẫu: nhấn vào đây
- Slide bài học: nhấn vào đây