Lập trình C#

Kiểu enum trong lập trình C#

Kiểu enum trong lập trình C#
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

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:

  1. enum là gì? Đặc điểm của enum
  2. Cách khai báo kiểu enum
  3. 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
#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 red = Color.RED;

Color green = Color.GREEN;

– 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().

// Không thể gán trực tiếp giá trụ của enum cho biến kiểu string
// Error: Cannot implicitly convert type 'Color' to 'string'
string blue1 = Color.BLUE;

// OK
string blue2 = Color.BLUE.ToString();	// blue2 = BLUE

– 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:

// Không thể gán trực tiếp giá trụ của enum cho biến kiểu int
// 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

– Với enum, bạn có thể sử dụng toán tử == để so sánh:

Color color = Color.YELLOW;

// 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" );
}
#2. Chuyển đổi giá trị về kiểu enum
#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ố đó.

// Trường hợp CÓ đại diện trong enum
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

Đố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
#3. Duyệt trên các phần tử của enum
#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:

// Lấy ra tất cả các phần tử của enum theo Values.
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));
}
Kết quả chương trình

Kết quả chương trình

#4. Sử dụng switch với enum
#4. Sử dụng switch với enum

Cách sử dụng như sau:

using System;

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();
		}
	}
}
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi! Minh Hoàng Blog | Nào cùng vui hehe


Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp người đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[…]

Bình luận của bạn

1 bình luận cho bài viết "Kiểu enum trong lập trình C#"

avatar
Sắp xếp theo:   Mới nhất | Cũ nhất | Thích nhiều nhất
trackback

[…] 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ể […]

Chúc bạn có một cuộc sống ngoại hạng!