Trong lập trình C#, struct và enum là hai khái niệm quan trọng, giúp lập trình viên tổ chức và quản lý dữ liệu một cách hiệu quả.
Contents
1. struct trong C#
struct (cấu trúc) là một kiểu dữ liệu giá trị, cho phép gộp nhóm các biến có liên quan thành một đơn vị logic. Khác với class (lớp), struct được lưu trữ trên stack và thường được sử dụng cho các đối tượng nhẹ, không yêu cầu kế thừa hoặc đa hình.
Khai báo struct:
Sử dụng từ khóa struct để định nghĩa một cấu trúc:
public struct Product
{
public string Name;
public decimal Price;
public Product(string name, decimal price)
{
Name = name;
Price = price;
}
public override string ToString()
{
return $"{Name}: {Price:C}";
}
}
Sử dụng struct:
Khi làm việc với struct, bạn có thể tạo các instance và truy cập các thành viên của nó:
Product productA = new Product("Laptop", 1500.00m);
Product productB = productA; // Sao chép giá trị
productB.Name = "Smartphone";
Console.WriteLine(productA.ToString()); // Output: Laptop: $1,500.00
Console.WriteLine(productB.ToString()); // Output: Smartphone: $1,500.00
Trong ví dụ trên, productB là một bản sao của productA. Việc thay đổi productB không ảnh hưởng đến productA, do struct là kiểu giá trị.
So sánh struct và class:
structlà kiểu giá trị, lưu trữ trên stack, phù hợp cho các đối tượng nhỏ, đơn giản.classlà kiểu tham chiếu, lưu trữ trên heap, thích hợp cho các đối tượng phức tạp, hỗ trợ kế thừa và đa hình.
2. Struct được lưu trữ ở đâu: Stack hay Heap?
- Struct trong Stack:
- Khi
structđược khai báo bên trong một phương thức, nó được lưu trữ trong Stack. - Bộ nhớ Stack được sử dụng cho các biến cục bộ có phạm vi tồn tại ngắn.
- Sau khi phương thức hoàn thành, bộ nhớ dành cho
structsẽ được giải phóng tự động.
- Khi
Ví dụ:
struct Point
{
public int X;
public int Y;
}
void CreatePoint()
{
Point p = new Point { X = 10, Y = 20 }; // Lưu trữ trong Stack
Console.WriteLine($"Point: ({p.X}, {p.Y})");
}
- Struct trong Heap:
- Nếu một
structlà thành viên của một lớp hoặc được đóng gói bên trong một kiểu tham chiếu,structđó sẽ được lưu trữ trong Heap, vì lớp chủ quản (class) được lưu trữ trên Heap.
- Nếu một
Ví dụ:
class Container
{
public Point Location;
}
void CreateContainer()
{
Container container = new Container();
container.Location = new Point { X = 10, Y = 20 }; // Lưu trữ trong Heap
Console.WriteLine($"Location: ({container.Location.X}, {container.Location.Y})");
}
Tóm lại:
- Nếu
structđược khai báo độc lập trong phương thức: Lưu trữ trong Stack. - Nếu
structlà một thành viên của lớp hoặc được tham chiếu bởi một kiểu tham chiếu: Lưu trữ trong Heap.
3. Ưu và nhược điểm của việc lưu trữ trong Stack và Heap
| Tiêu chí | Stack | Heap |
|---|---|---|
| Tốc độ | Nhanh hơn vì truy cập trực tiếp. | Chậm hơn do cần quản lý bởi Garbage Collector. |
| Thời gian tồn tại | Tồn tại trong phạm vi của phương thức. | Tồn tại lâu hơn, cho đến khi được giải phóng. |
| Quản lý bộ nhớ | Tự động giải phóng khi phương thức kết thúc. |
4. enum trong C#
enum (kiểu liệt kê) cho phép định nghĩa một tập hợp các hằng số có tên, giúp mã nguồn trở nên rõ ràng và dễ hiểu hơn.
Khai báo enum:
Sử dụng từ khóa enum để định nghĩa một kiểu liệt kê:
public enum EducationLevel
{
Poor = 0,
Average = 1,
Good = 2,
Excellent = 3
}
Sử dụng enum:
Bạn có thể khai báo biến kiểu enum và gán giá trị cho nó:
EducationLevel level = EducationLevel.Good;
switch (level)
{
case EducationLevel.Poor:
Console.WriteLine("Needs improvement.");
break;
case EducationLevel.Average:
Console.WriteLine("Satisfactory.");
break;
case EducationLevel.Good:
Console.WriteLine("Well done.");
break;
case EducationLevel.Excellent:
Console.WriteLine("Outstanding!");
break;
}
Trong ví dụ này, biến level được gán giá trị EducationLevel.Good, và câu lệnh switch sẽ in ra “Well done.”.
Lưu ý:
- Mặc định, các hằng số trong
enumcó kiểuintvà giá trị bắt đầu từ 0, nhưng bạn có thể gán giá trị khác nếu cần. enumgiúp mã nguồn dễ đọc và giảm thiểu lỗi do sử dụng các giá trị hằng số trực tiếp.
5. Kết luận
Hiểu và sử dụng đúng struct và enum trong C# giúp bạn tổ chức dữ liệu hiệu quả, tăng tính rõ ràng và bảo trì cho mã nguồn.