Trong bài trước, mình đã giới thiệu cho bạn cấu trúc rẽ nhánh đầu tiên if else. Trong bài này, mình sẽ giới thiệu cấu trúc switch case trong C#. Đây là cấu trúc rẽ nhánh thứ 2 trong C#. Vậy trong bài học ngày hôm nay chúng ta cùng đi tìm hiểu chi tiết cấu trúc này nhé !
Cấu trúc switch case trong C#
Cấu trúc switch case trong C#, có thể nói là tương tự như cấu trúc switch case trong các ngôn ngữ dạng biên dịch khác. Nhưng Microsoft đã cải tiến cấu trúc này trong C# tiện lợi hơn rất nhiều. Khác với C cấu trúc switch case chỉ sử dụng được với biến số, thì trong C# đã được cải tiến lên sử dụng đối với tất cả các kiểu dữ liệu miễn là kiểu dữ liệu đó được hỗ trợ toán tử ==
.
Cấu trúc switch case này được sử dụng với cấu trúc như sau:
Để dễ hiểu hơn, chúng ta có ví dụ như sau:
using System; namespace luyencodec_ { class Program { static void Main(String[] args) { int a = 10; switch(a) { case 10: Console.WriteLine("a = 10"); break; default: break; } Console.ReadKey(); // dừng màn hình } } }
Ở đây chương trình cho ra kết quả:
a = 10
Chúng ta có thể thấy câu lệnh switch ở đây mình sử dụng với biến a
với a = 10
khi switch của chúng ta duyệt qua hết tất cả các case thì ở đây chúng ta có case bằng 10. Nên khi duyệt tới case này chương trình sẽ thực hiện câu lệnh bên trong.
Câu lệnh default
ở đây các bạn có thể thấy nó như không có tác dụng, nhưng câu lệnh default này sẽ thực hiện câu lệnh bên trong khi tất cả các case đều sai:
using System; namespace luyencodec_ { class Program { static void Main(String[] args) { int a = 25; switch(a) { case 10: Console.WriteLine("a = 10"); break; case 20: Console.WriteLine("a = 20"); break; default: Console.WriteLine("a khong co trong case nao"); break; } Console.ReadKey(); // dừng màn hình } } }
Chương trình lần này mình đã để cho biến a
không trúng 1 case nào. Như chúng ta có thể thấy biến a = 25
nên không trùng với case 10 và case 20 nên chương trnihf sẽ chuyển xuống câu lệnh label default
phía dưới.
Nhưng bạn có thấy điều kì lạ ở đây không ?
Đó là trong mỗi case hoặc default mình đều để thêm câu lệnh break ở dưới. Nói sơ qua một chút thì câu lệnh break
này sẽ làm chương trình thoát ra khỏi vòng lặp đang chạy hoặc làm chương trình thoát ra khỏi cấu trúc switch case. Vậy chúng ta thử bỏ các câu lệnh break này đi xem có gì xảy ra không nhé.
using System; namespace luyencodec_ { class Program { static void Main(String[] args) { int a = 20; switch(a) { case 10: Console.WriteLine("a = 10"); case 20: Console.WriteLine("a = 20"); default: Console.WriteLine("a khong co trong case nao"); } Console.ReadKey(); // dừng màn hình } } }
Chương trình này mình đã bỏ các câu lệnh break trong cấu trúc này. Và lúc này chương trình xảy ra lỗi:
C:UsersXXXXDesktopprojectluyencodec#Program.cs(11,5): error CS0163: Control cannot fall through from one case label ('case 10:') to another [C:UsersXXXXDesktopprojectluyencodec#luyencodec#.csproj] C:UsersXXXXDesktopprojectluyencodec#Program.cs(13,5): error CS0163: Control cannot fall through from one case label ('case 20:') to another [C:UsersXXXXDesktopprojectluyencodec#luyencodec#.csproj] C:UsersXXXXDesktopprojectluyencodec#Program.cs(15,5): error CS8070: Control cannot fall out of switch from final case label ('default:') [C:UsersXXXXDesktopprojectluyencodec#luyencodec#.csproj] The build failed. Fix the build errors and run again.
Lúc này chương trình lại xảy ra lỗi, lỗi này nói rằng không thể thoát ra khỏi các case trong cấu trúc. Vì vậy, mỗi lần tạo một case trong cấu trúc này chúng ta phải thêm câu lệnh break bên dưới case đó tránh trường hợp cấu trúc này sẽ duyệt đi duyệt lại và chương trình sẽ chạy vô tận.
Đó là ví dụ với biến số, ở phần trên mình đã đề cập rằng cấu trúc switch case trong C# có thể làm việc với tất cả các loại dữ liệu miễn dữ liệu đó được hỗ trợ toán tử ==
. Vậy mình có ví dụ về một “con AI switch case” như sau:
using System; namespace luyencodec_ { class Program { static void Main(String[] args) { Console.WriteLine("Please talk something here."); string talk = Console.ReadLine(); switch(talk) { case "Hello": Console.WriteLine("Hi !"); break; case "What's your name": Console.WriteLine("My name is Lap trinh khong kho !"); break; default: Console.WriteLine("Oops ! I don't hear what you say ?"); break; } Console.ReadKey(); // dừng màn hình } } }
Chúng ta chạy thử chương trình xem con AI này hoạt động nhé !
ví dụ với nhập vào Hello
ví dụ với nhập vào What’s your name
ví dụ nhập vào khác với 2 ví dụ trên
Như vậy chúng ta chỉ đơn ginả là dùng câu lệnh switch case. Chúng ta có thể tạo ra một con AI nói chuyện đơn giản. Nhưng nên nhớ đây không phải cách làm nên một con máy biết nói chuyện đâu nhé !
Khi nào sử dụng switch case và if else ?
Sau khi chúng ta biết đươc 2 cấu trúc rẽ nhánh trong C# rồi, thì có nhiều bạn lại sử dụng 2 cấu trúc này lung tung làm chương trình xuất hiện lỗi tràn lan, khó xử lý. Trong phần này mình sẽ note lại cho các bạn một số mẹo để phân biệt lúc nào nên sử dụng switch case và lúc nào nên sử dụng if else nhé !
- Thứ nhất: Chỉ nên sử dụng cấu trúc if else khi biểu thức logic của bạn cần kiểm tra là một biểu thức logic phức tạp (bao gồm
<=
,>=
,||
,&&
,!
) và nhiều câu lệnh điều kiện khác ở bên trong. - Thứ hai: Chỉ nên sử dụng cấu trúc switch case khi biểu thức đầu vào của bạn có hỗ trợ toán tử
==
và biểu thức đó không phải là biểu thức logic phức tạp.
Như vậy nhờ 2 note trên mong là các bạn có thể dễ dàng phân biệt đươc khi nào nên sử dụng switch case và khi nào nên sử dụng if else.
Tổng kết
Như vậy là trong bài học ngày hôm này mình đã hướng dẫn nốt phần còn lại của cấu trúc rẽ nhánh trong C#. Bài học tiếp theo chúng ta sẽ học về cấu trúc cũng không kém phần quan trọng khác đó là cấu trúc lặp trong C#. Cảm ơn bạn đã đọc bài viết này. Hãy tiếp tục ủng hộ Lập trình không khó trong các bài viết tiếp theo nhé !
(ngoài ra các bạn có thể thử qua với các bài tập sau đây)
Để lại một bình luận