Kiểu enum trong lập trình C#
Trong bài hôm nay, chúng ta sẽ tìm hiểu về kiểu enum trong lập trình C#, với những nội dung sau:
- enum là gì? Đặc điểm của enum
- Cách khai báo kiểu enum
- Cách sử dụng kiểu enum
- #1. Truy xuất phần tử của enum.
- #2. Chuyển đổi giá trị về kiểu enum.
- #3. Duyệt trên các phần tử của enum.
- #4. Sử dụng switch với enum.
1. enum là gì? Đặc điểm của enum
– enum trong C# là một từ khóa dùng để khai báo một tập hợp kiểu liệt kê (enumeration).
– Một enumeration là một tập hợp các phần tử có cùng tính chất. Mỗi phần tử trong tập hợp có tên dễ gợi nhớ đại diện cho một giá trị nguyên (integer), mặc định bắt đầu từ 0.
– enum là một kiểu tham trị giống như kiểu struct.
– enum không được phép kế thừa.
2. Cách khai báo kiểu enum
– Cú pháp khai báo:
enum <ten_enum> { <danh_sach_cac_ten_hang> }
Trong đó:
・ ten_enum : là tên kiểu liệt kê và tuân thủ theo quy tắc đặt tên biến.
・ danh_sach_cac_ten_hang : là danh sách các giá trị hằng của enum được ngăn cách nhau bằng dấu phẩy “,”. Cách đặt tên cũng tuân thủ theo quy tắc đặt tên biến.
– Ví dụ:
enum Color { RED, // hoặc Red, red,... BLUE, // hoặc Blue, blue,... YELLOW // hoặc Yellow, yellow,... }
・ Với cách khai báo như trên thì chúng ta có:
- Một kiểu liệt kê tên là Color.
- Vì không thiết lập giá trị cho các hằng nên RED, BLUE, YELLOW sẽ đại diện cho các số nguyên lần lượt là 0, 1, 2 (Mặc định bắt đầu từ 0 và tăng dần cho các giá trị hằng tiếp theo)
・ Các tên hằng trong enum Color tương đương với cách khai báo hằng thông thường là:
public const int RED = 0; public const int BLUE = 1; public const int YELLOW = 2;
・ Ngoài ra, nếu không muốn giá trị của từng hằng bắt đầu từ 0 như mặc định, thì chúng ta cũng có thể set luôn một giá trị nguyên bất kỳ khi khai báo enum:
enum Color { RED = 8, BLUE = 6, YELLOW = 2017, GREEN = RED + 9 }
Khi đó các hằng RED, BLUE, YELLOW, GREEN sẽ đại diện cho các số nguyên là 8, 6, 2017, 17
3. Cách sử dụng kiểu enum
#1. Truy xuất phần tử của enum
– Chúng ta có thể truy xuất đến từng hằng của enum thông qua toán tử dấu chấm “.”, rồi kèm theo tên hằng muốn truy xuất.
Color green = Color.GREEN;
[/code]
– Mặc dù, chúng ta thấy tên hằng trong khai báo enum là một string, nhưng chúng ta không thể gán trực tiếp tên hằng đó cho một biến kiểu string, mà phải cần dùng phương thức ToString().
// Error: Cannot implicitly convert type ‘Color’ to ‘string’
string blue1 = Color.BLUE;
// OK
string blue2 = Color.BLUE.ToString(); // blue2 = BLUE
[/code]
– Tương tự vậy, như đã nói ở trên: mỗi tên hằng của enum là đại diện cho một nguyên (integer) nhưng bạn cũng không thể gán hay so sánh trực tiếp chúng với các số nguyên được mà phải ép kiểu:
// Error: Cannot implicitly convert type ‘Color’ to ‘int’.
// An explicit conversion exists (are you missing a cast?)
int blue1 = Color.BLUE;
// OK
int blue2 = (int)Color.BLUE; // blue2 = 6
[/code]
– Với enum, bạn có thể sử dụng toán tử == để so sánh:
// Sử dụng toán tử == để so sánh 2 phần tử của enum.
if (color == Color.YELLOW)
{
Console.WriteLine( "Color is Yellow" );
}
[/code]
#2. Chuyển đổi giá trị về kiểu enum
– Đối với kiểu nguyên (integer): khi cast về kiểu enum, nếu trong tập hợp enum có tên hằng đại diện cho số đó thì kết quả sẽ trả về tên hằng đó, trường hợp không có sẽ trả về giá trị là chính số đó.
Color color1 = (Color)17;
Console.WriteLine("color1 = {0}", color1); // color1 = GREEN
// Trường hợp KHÔNG CÓ đại diện trong enum
Color color2 = (Color)99;
Console.WriteLine("color2 = {0}", color2); // color2 = 99
[/code]
– Đối với kiểu chuỗi (string): khi cast về kiểu enum, nếu trong tập hợp enum có tên hằng đại diện cho chuỗi thì kết quả sẽ trả về tên hằng đó, trường hợp không có sẽ sinh ra Exception. Vì thế nên dùng hàm TryParse để vừa kiểm tra, vừa chuyển đổi.
* ■ Sử dụng TryParse
*/
// Trường hợp CÓ đại diện trong enum
Color color1;
Enum.TryParse("17", out color1);
Console.WriteLine("color1 = {0}", color1); // color1 = GREEN
Color color2;
Enum.TryParse("GREEN", out color2);
Console.WriteLine("color2 = {0}", color2); // color2 = GREEN
// Trường hợp KHÔNG CÓ đại diện trong enum
Color color3;
Enum.TryParse("green", out color3);
Console.WriteLine("color3 = {0}", color3); // color3 = 0
Color color4;
Enum.TryParse("99", out color4);
Console.WriteLine("color4 = {0}", color4); // color4 = 99
/*
* ■ Sử dụng Parse
*/
var colorParse1 = Enum.Parse( typeof(Color), "17" );
Console.WriteLine("colorParse1 = {0}", colorParse1); // colorParse1 = GREEN
var colorParse2 = Enum.Parse( typeof(Color), "GREEN" );
Console.WriteLine("colorParse2 = {0}", colorParse2); // colorParse2 = GREEN
var colorParse3 = Enum.Parse( typeof(Color), "green" );
Console.WriteLine("colorParse3 = {0}", colorParse3); // Error exception: System.ArgumentException
[/code]
#3. Duyệt trên các phần tử của enum
Chúng ta có thể duyệt trên tất cả các phần tử của enum như sau:
Array arrValues = Enum.GetValues(typeof(Color));
foreach (Color color in arrValues)
{
Console.WriteLine("Color Text: " + color);
}
// Lấy ra tất cả các phần tử của enum theo Names.
Array arrNames = Enum.GetNames(typeof(Color));
foreach (string color in arrNames)
{
Console.WriteLine("Color Code: " + (int)Enum.Parse(typeof(Color), color));
}
[/code]
#4. Sử dụng switch với enum
Cách sử dụng như sau:
namespace MinhHoangBlog
{
// Declare enum here
enum Role
{
Member,
Moderator,
Administrator,
Editor
}
class Program
{
// Or here
enum Color
{
RED = 8,
BLUE = 6,
YELLOW = 2017,
GREEN = RED + 9
}
static void Main(string[] args)
{
// Create and initialize instance of enum type
Color myColor = Color.YELLOW;
//Color myColor = 99;
// Make decision based on enum value
switch (myColor)
{
case Color.RED:
Console.WriteLine( "Color is Red." );
break;
case Color.BLUE:
Console.WriteLine( "Color is Blue." );
break;
case Color.YELLOW:
Console.WriteLine( "Color is Yellow." );
break;
case Color.GREEN:
Console.WriteLine( "Color is Green." );
break;
default:
Console.WriteLine( "Color cannot found." );
break;
}
Console.ReadKey();
}
}
}
[/code]
[…] các bạn biết kiểu tập hợp enum thì mỗi phần tử sẽ đại diện cho một số nguyên interger. Chúng ta không thể […]