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
:
struct
là kiểu giá trị, lưu trữ trên stack, phù hợp cho các đối tượng nhỏ, đơn giản.class
là 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
struct
sẽ đượ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
struct
là 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
struct
là 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
enum
có kiểuint
và giá trị bắt đầu từ 0, nhưng bạn có thể gán giá trị khác nếu cần. enum
giú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.