Sử dụng struct trong C#

struct là một cấu trúc dữ liệu - kiểu dữ liệu này tạo thành khi ta muốn gộp cá biến có sự liên quan với nhau thành một nhóm. Ví dụ, mô tả một sản phẩm trên trang web có thể khai báo cấu trúc:

struct Product {
    string name;                // tên sản phẩm
    string description;         // mô tả về sản phẩm
    decimal price;              // giá
    string manufactory;         // nhà máy sản xuất
}

struct thấy rất giống với class, tuy nhiên struct phù hợp đối với tập dữ liệu thuộc tính nhỏ hơn, ít phức tạp - và khi sử dụng struct không cần phải khởi tạo, ví dụ:

Product  productA;
productA.name = "IPhone";
productA.description = "Điện thoại";


Console.WriteLine(productA.name);               // Iphone
Console.WriteLine(productA.description);        // Điện thoại

struct cũng có thể xây dựng nó có các thuộc tính, phương thức, indexer, hàm khởi tạo như lớp. Tuy nhiên khi có thuộc tính hoặc khi có hàm khởi tạo thị biến struct phải khởi tạo bởi toán tử new

struct Product {
    public string name;
    public string description;
    public decimal price;

    public string manufactory;

    public void PrintInfo() {
        Console.WriteLine(name);
        Console.WriteLine(description);
    }

    public Product(string name) {
        this.name = name;
        this.description = "";
        this.price = 0;
        this.manufactory = "";
    }
}

Sử dụng khi struct có khởi tạo cần toán tử new

Product macbookpro = new Product("MacBook");
macbookpro.description = "Máy tính";

macbookpro.PrintInfo(); //Macbook \n máy tính

So sánh sự khác nhau giữa class và struct

  • Struct phù hợp khi muốn gom một lượng nhỏ các biến có kiểu nguyên thủy (int, float ...), thuộc tính lại với nhau. Class thì dùng khi các diễn tả đối tượng chứa các biến, thuộc tính và xử lý dữ liệu phức tạp.
  • Struct có thể dùng khai báo biến mà không cần thao tác tạo đối tượng. BIẾN KIỂU STRUCT LÀ THAM TRỊ CÒN BIẾN CLASS LÀ THAM CHIẾU . struct được lưu ở bộ nhớ stack, còn đối tượng được sinh ra bới class được lưu ở bộ nhớ heap - bộ nhớ heap được quản lý, giám sát, thu hồi tự động bởi GC.

Vị dụ thể hiện struct là tham trị

Product giuongngu = new Product("Giường");
giuongngu.description = "Đồ nội thất XYZ";

Product banlamviec = giuongngu;
// các thuộc tính trong banlamviec (name, description ...) được gán giá trị bởi giuongngu,
// chứ hai biến banlamviec và giuongngu không cùng trỏ (tham chiếu) đến cùng một đối tượng như phép gán class


banlamviec.name = "Bàn";        // name cả banlamviec cập nhật, nhưng name của giuongngu độc lập với nó
giuongngu.PrintInfo();
banlamviec.PrintInfo();
Giường
Đồ nội thất XYZ
Bàn
Đồ nội thất XYZ

Sử dụng kiểu liệt kê - enum

Tử khóa enum để khai báo kiểu liệt kê, kiểu này nó khai báo một tập hợp các hằng số có tên, mặc định giá trị các hằng số này là kiểu int và bắt đầu từ 0 trở đi trong khai báo kiểu liệt kê.

Ví dụ - khai báo kiểu liệt kê thể hiện học lực của sinh viên gồm có: Kém (0), Trung bình (1), Khá (2), Giỏi (3)

enum HocLuc {Kem, TrungBinh, Kha, Gioi};

Mặc định enum sẽ thiết lập tên các khai báo sẽ nhận giá trị tương ứng từ 0, 1, 2 ... Tuy nhiên, bạn có thể gán một tên nào đó ứng với giá trị cụ thể, ví dụ TrungBinh nhận giá trị 5

enum HocLuc {Kem, TrungBinh = 5, Kha, Gioi};

Do TrungBinh bằng 5, nên tên tiếp theo Kha sẽ nhận 6, Giỏi là 7

Để nhận giá trị liệt kê - bạn dùng toán tử . rồi đến tên phần tử.

enum HocLuc {Kem, TrungBinh, Kha, Gioi}
static void Main(string[] args)
{
    int a = (int)HocLuc.Kha;  // cast enum thành int
    Console.WriteLine(a);     // 2
}
    

Khai báo kiểu enum rất phù hợp khi giá trị của biến nhận một giá trị hằng số trong tập hằng số hữu hạn nào đó, như danh sách các ngày trong tuần, trạng thái online / offline, và đặc biệt hay dùng Enum với câu lệnh switch

HocLuc hocluc = HocLuc.Kha;    // khai báo biến hocluc kiểu enum và khởi tạo giá trị bằng HocLuc.Kha
switch (hocluc)
{
    case HocLuc.Kem:
        Console.WriteLine("Học lực kém");
    break;
    case HocLuc.Kha:
        Console.WriteLine("Học lực Kha");
    break;
     case HocLuc.Gioi:
        Console.WriteLine("Học lực Giỏi");
    break;
    default:
        Console.WriteLine("Học lực TB");
    break;

}

Bạn có thể cast - chuyển kiểu qua lại giữa enum và int

HocLuc hoc = (HocLuc)2;
Console.WriteLine(hoc); //Kha

Sử dụng enum, khi viết code tên của Enum nó đã gợi nhớ giá trị - ý nghĩa của dữ liệu nên code dễ đọc, dễ hiểu hơn

HocLuc hocluc_hocsinhA = HocLuc.Kha;
int    hocluc_hocsinhB = 2;

Hai dòng code trên, về logic có thể hoàn toàn giống nhau. Nhưng đọc code ở dòng 1 sẽ dễ hơn đọc ở dòng 2 nhiều.

Đăng ký theo dõi ủng hộ kênh