13 Struct và Enum

Trong lập trình C#, structenum 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ả.

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

  • 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.

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 structthà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.

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íStackHeap
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ạiTồ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ểu int 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 structenum 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.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *