So sánh biểu thức if … else if và switch … case trong c#
Hôm nay, Góc Kinh Nghiệm cho bạn cái nhìn tổng quát về 2 biểu thức: if … else if và switch … case trong C#. Cả 2 điều là biểu thức điều kiện dùng để so sánh nhiều biểu thức logic của một giá trị truyền vào. Khi cần so sánh giá trị logic với số lượng ít thì biểu thức if … else ...
Hôm nay, Góc Kinh Nghiệm cho bạn cái nhìn tổng quát về 2 biểu thức: if … else if và switch … case trong C#. Cả 2 điều là biểu thức điều kiện dùng để so sánh nhiều biểu thức logic của một giá trị truyền vào.
Khi cần so sánh giá trị logic với số lượng ít thì biểu thức if … else if là sự lựa chọn đúng đắng và thích hợp nhất. Nhưng đối với số lượng lớn hơn 2 hoặc 3 thì việc dùng biểu thức if … else if trở nên mất thời nhiều thời gian cho việc viết code và đọc bằng mắt thường. Vì các điều kiện lằn nhằn, chi chích với nhau như ví dụ 1 bên dưới.
Giả sử bạn nhập vào một tên thiết bị, sau đó nhấn nút “Classify” (phân loại thiết bị), chương trình sẽ thông báo thiết bị bạn nhập vào thuộc loại thiết bị nào.
Ví dụ 1: phân loại thiết bị sử dụng biểu thức if … else if
void ClassifyDeviceByUsing_If_ElseIf() { string deviceName = txtDevice.Text.Trim(); // Lưu tên thiết bị bạn nhập vào string kindOfDevice = ""; // lưu loại thiết bị của deviceName if ((string.Compare(deviceName, "Laptop") == 0) || (string.Compare(deviceName, "Máy tính để bàn") == 0) || (string.Compare(deviceName, "Chuột") == 0)) { kindOfDevice = "Thiết bị tin học"; } else if (string.Compare(deviceName, "Máy quạt") == 0) { kindOfDevice = "Thiết bị gia dụng"; } else if (string.Compare(deviceName, "Nokia N97") == 0) { kindOfDevice = "Thiết bị điện thoại"; } else { kindOfDevice = "Không biết loại thiết bị"; } MessageBox.Show("Thiết bị <" + deviceName + "> thuộc loại thiết bị <" + kindOfDevice + ">"); }
Như bạn đã thấy, ở ví dụ trên quả thật là khó đọc và mất nhiều thời gian để viết code cho hàm ClassifyDeviceByUsing_If_ElseIf() trên. Tuy nhiên, bạn hãy tưởng tượng thay vì 3 loại thiết bị trên bạn cần kiểm tra cho 10 hoặc 20 loại thiết bị, thì code của bạn lung tung và rối rắm như thế nào?. Bạn cần một giải pháp cho code của bạn sạch sẽ và gọn gàng, giải pháp đó là dùng biểu thức switch … case.
Dưới đây là cú pháp của biểu thức switch … case:
switch (value) { case constant: statements break/jump case constant: statements break/jump default: statements break/jump }
Ghi chú:
- Tương ứng với mỗi case là một constant, tức là một hằng chứ không được dùng một parameter (biến).
- Mỗi case tương ứng với if
- break: dùng để thoát ra khỏi biểu thức switch
- jump: tức là lệnh goto hoặc continue, thay vì break bạn có thể dùng goto, hoặc continue tùy theo mục đích của bạn
- cuối ùng là default, nếu value không thuộc bất cứ case nào thì code trong default sẽ được thực thi.
Ví dụ 2: code bên dưới được chuyển từ cách dùng if … else if sang switch … case
void ClassifyDeviceByUsing_Switch_Case() { string deviceName = txtDevice.Text.Trim(); // Lưu tên thiết bị bạn nhập vào string kindOfDevice = ""; // lưu loại thiết bị của deviceName switch (deviceName) { case "Laptop": case "Máy tính để bàn": case "Chuột": kindOfDevice = "Thiết bị tin học"; break; case "Máy quạt": kindOfDevice = "Thiết bị gia dụng"; break; case "Nokia N97": kindOfDevice = "Thiết bị điện thoại"; break; default: kindOfDevice = "Không biết loại thiết bị"; break; } MessageBox.Show("Thiết bị <" + deviceName + "> thuộc loại thiết bị <" + kindOfDevice + ">"); }
Giải thích ví dụ trên:
Khi bạn chạy chương trình, bạn nhập tên thiết bị vào textbox deviceName, giá trị của deviceName sẽ được đem so sách với các case trong switch, tùy vào giá trị bạn nhập vào chương trình sẽ phân loại thiết bị bạn nhập vào thuộc loại thiết bị nào và xuất ra thông báo.
So sánh ví dụ 1 và ví dụ 2 ta thấy ví dụ 2 sử dụng switch … case làm cho code sạch sẽ, rõ ràng dễ đọc.
Dưới đây là đoạn code hoàn chỉnh, được viết trên VS2005:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MyProject.Comparation { public partial class FormCompareIfElseAndSwitchCase : Form { public FormCompareIfElseAndSwitchCase() { InitializeComponent(); this.btnClassify.Click += new EventHandler(btnClassify_Click); } void btnClassify_Click(object sender, EventArgs e) { //ClassifyDeviceByUsing_If_ElseIf(); ClassifyDeviceByUsing_Switch_Case(); } void ClassifyDeviceByUsing_If_ElseIf() { string deviceName = txtDevice.Text.Trim(); // Lưu tên thiết bị bạn nhập vào string kindOfDevice = ""; // lưu loại thiết bị của deviceName if ((string.Compare(deviceName, "Laptop") == 0) || (string.Compare(deviceName, "Máy tính để bàn") == 0) || (string.Compare(deviceName, "Chuột") == 0)) { kindOfDevice = "Thiết bị tin học"; } else if (string.Compare(deviceName, "Máy quạt") == 0) { kindOfDevice = "Thiết bị gia dụng"; } else if (string.Compare(deviceName, "Nokia N97") == 0) { kindOfDevice = "Thiết bị điện thoại"; } else { kindOfDevice = "Không biết loại thiết bị"; } MessageBox.Show("Thiết bị <" + deviceName + "> thuộc loại thiết bị <" + kindOfDevice + ">"); } void ClassifyDeviceByUsing_Switch_Case() { string deviceName = txtDevice.Text.Trim(); // Lưu tên thiết bị bạn nhập vào string kindOfDevice = ""; // lưu loại thiết bị của deviceName switch (deviceName) { case "Laptop": case "Máy tính để bàn": case "Chuột": kindOfDevice = "Thiết bị tin học"; break; case "Máy quạt": kindOfDevice = "Thiết bị gia dụng"; break; case "Nokia N97": kindOfDevice = "Thiết bị điện thoại"; break; default: kindOfDevice = "Không biết loại thiết bị"; break; } MessageBox.Show("Thiết bị <" + deviceName + "> thuộc loại thiết bị <" + kindOfDevice + ">"); } } }
Góc Kinh Nghiệm chúc các bạn thành công!