C# Enum(Đếm) với ví dụ

⚡ Tóm tắt thông minh

Trong C#, kiểu liệt kê định nghĩa một tập hợp các giá trị nguyên không đổi được đặt tên, chẳng hạn như các ngày trong tuần, giúp mã dễ đọc và dễ bảo trì hơn. Từ khóa `enum` khai báo các hằng số cố định này một lần để có thể sử dụng lại trong toàn bộ chương trình.

  • 📐 Định nghĩa: Từ khóa enum nhóm các hằng số có tên liên quan vào cùng một kiểu, thay thế các số "ma thuật" rải rác bằng các định danh dễ đọc hơn.
  • 🗓️ Ví dụ về ngày: Một kiểu liệt kê có tên là Days lưu trữ các ngày trong tuần, và Days.Sun trả về thành viên được chọn theo tên của nó.
  • 🔢 Các giá trị cốt lõi: Các thành viên của kiểu liệt kê (enum) ánh xạ tới các giá trị số nguyên bắt đầu từ 0 và tăng dần lên 1, trừ khi các số tùy chỉnh được gán.
  • 🔁 Chuyển đổi: Các phép ép kiểu tường minh biến một kiểu liệt kê thành số nguyên của nó, trong khi Enum.Parse và Enum.TryParse chuyển đổi văn bản trở lại thành các thành viên.
  • 🚩 Cờ: Thuộc tính Flags cho phép một kiểu liệt kê kết hợp nhiều tùy chọn dưới dạng các trường bit bằng cách sử dụng toán tử OR bitwise.
  • 🤖 Hỗ trợ AI: GitHub Copilot và ML.NET hỗ trợ tạo định nghĩa enum và ánh xạ các enum với các đặc trưng của máy học.

C# Enum (Liệt kê)

Bảng liệt kê C#

Một bảng liệt kê được sử dụng trong bất kỳ ngôn ngữ lập trình nào để xác định một tập hợp các giá trị không đổi. Ví dụ: các ngày trong tuần có thể được định nghĩa dưới dạng bảng liệt kê và được sử dụng ở bất kỳ đâu trong chương trình. Trong C#, phép liệt kê được xác định với sự trợ giúp của từ khóa 'enum'.

Hãy xem một ví dụ về cách chúng ta có thể sử dụng từ khóa 'enum'.

Trong ví dụ của chúng tôi, chúng tôi sẽ xác định một bảng liệt kê gọi là ngày, sẽ được sử dụng để lưu trữ các ngày trong tuần. Đối với mỗi ví dụ, chúng tôi sẽ chỉ sửa đổi hàm chính trong tệp Program.cs của mình.

Bảng liệt kê C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program 
 {
  enum Days{Sun,Mon,tue,Wed,thu,Fri,Sat};
  
  static void Main(string[] args) 
  {
   Console.Write(Days.Sun);
   
   Console.ReadKey();
  }
 }
}

Code Giải trình:-

  1. 'enum' loại dữ liệu được chỉ định để khai báo một bảng liệt kê. Tên của bảng liệt kê là Ngày. Tất cả các ngày trong tuần được chỉ định làm giá trị của bảng liệt kê.
  2. Cuối cùng, hàm console.write được sử dụng để hiển thị một trong các giá trị của bảng liệt kê.

Nếu mã trên được nhập đúng và chương trình được thực thi thành công, kết quả sau sẽ được hiển thị.

Đầu ra:

Bảng liệt kê C#

Từ kết quả đầu ra, bạn có thể thấy giá trị 'Mặt trời' của bảng liệt kê được hiển thị trong bảng điều khiển.

Tại sao nên sử dụng Enum trong C#?

Kiểu liệt kê (enum) giúp chương trình dễ đọc hơn, an toàn hơn và dễ bảo trì hơn. Thay vì rải rác các số không giải thích được, đôi khi được gọi là số ma thuật, trong toàn bộ mã, kiểu liệt kê gán cho mỗi giá trị một tên mô tả rõ ràng mục đích của nó.

  • Khả năng đọc: Một cái tên như Days.Fri rõ ràng hơn nhiều so với con số 5, vì vậy bất kỳ ai đọc mã đều hiểu ý nghĩa ngay lập tức.
  • Loại an toàn: Một biến được khai báo với kiểu liệt kê chỉ có thể chứa một trong các thành viên được định nghĩa, điều này ngăn chặn việc truyền các giá trị không hợp lệ.ping .
  • Khả năng bảo trì: Các hằng số liên quan cùng tồn tại ở một vị trí duy nhất, vì vậy việc thêm hoặc đổi tên một giá trị sẽ cập nhật toàn bộ chương trình một cách nhất quán.
  • Liên kết dữ liệu: Các framework như WPF và ASP.NET có thể liên kết một kiểu liệt kê (enum) với một danh sách thả xuống, điều này làm cho kiểu liệt kê trở nên hữu ích trong việc xây dựng giao diện người dùng.

Vì trình biên dịch kiểm tra mọi phép gán so với các thành viên được cho phép, kiểu liệt kê (enum) cũng giúp phát hiện lỗi sớm, trước khi chương trình chạy.

Gán giá trị tùy chỉnh cho kiểu liệt kê C#

Theo mặc định, C# gán giá trị 0 cho thành viên đầu tiên của kiểu liệt kê và tăng mỗi thành viên tiếp theo lên một. Trong kiểu liệt kê Days ở trên, Sun bằng 0, Mon bằng 1 và Sat bằng 6. Bạn có thể ghi đè các giá trị mặc định này bằng cách gán các số cụ thể.

  • Giá trị cụ thể: Việc viết enum Level {Low = 1, Medium = 5, High = 10} sẽ gán cho mỗi thành viên một số được chọn thay vì chuỗi số mặc định.
  • Bài tập một phần: Nếu bạn chỉ gán giá trị cho một số thành viên, trình biên dịch sẽ tiếp tục đánh số từ giá trị được gán cuối cùng cho các thành viên tiếp theo.
  • Loại cơ bản: Theo mặc định, kiểu liệt kê (enum) lưu trữ các thành viên dưới dạng kiểu int, nhưng bạn có thể dựa trên kiểu byte, short hoặc long để tiết kiệm bộ nhớ hoặc mở rộng phạm vi.

Các giá trị tùy chỉnh rất hữu ích khi các số phải khớp với một hệ thống bên ngoài, chẳng hạn như mã cơ sở dữ liệu hoặc hằng số giao thức, để kiểu liệt kê phản ánh chính xác dữ liệu thực.

Cách chuyển đổi kiểu liệt kê (enum) trong C# sang kiểu int, string và flags

C# thường xuyên cần chuyển đổi giá trị của kiểu liệt kê (enum) sang một dạng khác, chẳng hạn như lưu trữ nó dưới dạng số hoặc đọc lại từ văn bản. Các chuyển đổi này được thực hiện theo một vài cách chuẩn.

  • Chuyển đổi Enum sang int: Việc ép kiểu tường minh như (int)Days.Wed sẽ trả về số nguyên cơ bản, điều này hữu ích cho việc lưu trữ hoặc tính toán.
  • Chuyển đổi số nguyên sang kiểu liệt kê: Việc ép kiểu theo hướng ngược lại, ví dụ như (Days)3, sẽ biến một số trở lại thành thành viên enum tương ứng.
  • Chuyển đổi chuỗi thành kiểu liệt kê: Enum.Parse và Enum.TryParse (an toàn hơn) chuyển đổi một tên như “Fri” thành thành viên Days.Fri mà không báo lỗi khi gặp văn bản không hợp lệ.
  • Chuyển đổi Enum sang chuỗi: Việc gọi phương thức ToString trên bất kỳ thành viên nào sẽ trả về tên của thành viên đó, vì vậy Days.Sun.ToString() sẽ trả về “Sun” để hiển thị hoặc ghi nhật ký.
  • Liệt kê các thành viên: Enum.GetValues ​​và Enum.GetNames trả về mọi giá trị hoặc tên, điều này hữu ích khi điền vào menu hoặc xác thực dữ liệu đầu vào.

Khi một kiểu liệt kê (enum) cần biểu diễn một tổ hợp các lựa chọn thay vì chỉ một lựa chọn duy nhất, hãy áp dụng thuộc tính Flags và gán cho mỗi thành viên một lũy thừa của hai, chẳng hạn như 1, 2, 4 và 8. Sau đó, bạn có thể kết hợp các thành viên bằng toán tử OR bitwise và kiểm tra một tùy chọn cụ thể bằng phương thức HasFlag.

Các kỹ thuật chuyển đổi này cho phép kiểu liệt kê chuyển đổi mượt mà giữa các tên dễ đọc, các số được lưu trữ và các tập hợp cờ kết hợp, giữ choping Phần còn lại của chương trình vừa an toàn về kiểu dữ liệu vừa dễ hiểu.

Câu Hỏi Thường Gặp

Biến kiểu enum mặc định có giá trị là 0, giá trị này được ánh xạ tới thành viên nào có giá trị bằng 0. Nếu không có thành viên nào có giá trị bằng 0, biến vẫn giữ giá trị 0, vì vậy các nhà phát triển thường định nghĩa một thành viên None hoặc Unknown trước để tránh nhầm lẫn.

Từ khóa `const` định nghĩa một giá trị duy nhất, trong khi kiểu liệt kê (enum) nhóm một tập hợp các hằng số có tên liên quan lại với nhau dưới một kiểu duy nhất. Kiểu liệt kê cũng tăng tính an toàn kiểu dữ liệu, vì một biến chỉ có thể chứa một trong các thành viên được định nghĩa của kiểu liệt kê đó.

Đúng vậy. Một kiểu liệt kê (enum) có thể được khai báo bên trong một không gian tên hoặc lồng ghép trong một lớp hoặc cấu trúc, điều này giới hạn phạm vi của nó trong kiểu đó. Tuy nhiên, C# không cho phép khai báo một kiểu liệt kê bên trong thân phương thức.

Đúng vậy. Hai hoặc nhiều thành viên có thể cùng chia sẻ một số cơ bản, khiến các tên sau trở thành bí danh của tên đầu tiên. Các phép so sánh coi chúng là bằng nhau, và việc chuyển đổi giá trị đó thành chuỗi sẽ trả về tên được định nghĩa đầu tiên trong kiểu liệt kê.

Enum là một kiểu giá trị, vì vậy nó lưu trữ dữ liệu trực tiếp chứ không phải dưới dạng tham chiếu trên heap. Nó kế thừa từ System.Enum nhưng hoạt động giống như kiểu số nguyên bên dưới, điều này giúp việc sao chép và so sánh các giá trị enum diễn ra nhanh chóng.

Đúng vậy. Trong ML.NET, bạn có thể ánh xạ một kiểu liệt kê (enum) sang một thuộc tính hoặc nhãn phân loại, thường bằng cách chuyển đổi nó thành giá trị số nguyên hoặc mã hóa one-hot. Các kiểu liệt kê có kiểu dữ liệu mạnh giúp cho các cột đầu vào của quy trình học máy trở nên rõ ràng và nhất quán.

Đúng vậy. GitHub Copilot đề xuất các định nghĩa enum hoàn chỉnh, giá trị tùy chỉnh, thuộc tính Flags và các công cụ hỗ trợ chuyển đổi như Enum.TryParse bên trong Visual Studio. VS Code. RevHãy xem xét kỹ từng đề xuất, vì Copilot có thể chọn các giá trị hoặc tên không phù hợp với miền của bạn.

Sử dụng phương thức Enum.IsDefined, phương thức này trả về true khi một số hoặc tên được cung cấp khớp với một thành viên đã được định nghĩa. Kết hợp nó với Enum.TryParse cho phép bạn xác thực đầu vào của người dùng một cách an toàn trước khi chuyển đổi văn bản thành giá trị enum.

Tóm tắt bài viết này với: