1. Giới thiệu
Struct — là một kiểu dữ liệu đặc biệt trong C#, cho phép gom nhiều giá trị (thậm chí khác kiểu) vào một “hộp” duy nhất. Nó giống như bộ LEGO nhỏ: bạn ghép các mảnh lại, và kết quả là một object tiện lợi, gọn nhẹ.
Struct khá giống class, nhưng nó có những đặc điểm riêng, và thường dùng cho các trường hợp “đơn giản”, khi bạn không cần sức mạnh và “nặng nề” của class.
Cú pháp
struct Point
{
public int X;
public int Y;
}
Trong ví dụ này, mình mô tả struct cho một điểm trên mặt phẳng với tọa độ X và Y.
Struct dùng ở đâu?
Struct thường dùng cho các object nhỏ, đơn giản, cần cực kỳ nhẹ và “chỉ là dữ liệu”.
Trong C#, một số kiểu chuẩn là struct:
- int, double, bool, DateTime, TimeSpan, decimal, Guid
- và thậm chí, ví dụ như ConsoleKeyInfo hoặc Point (trong thư viện đồ họa)
Khác biệt giữa struct và class
| Tiêu chí | Struct | Class |
|---|---|---|
| Từ khóa | |
|
| Kiểu lưu trữ | Value Type | Reference Type |
| Lưu ở đâu | Stack (vùng nhớ) | Heap (vùng nhớ) |
| Truyền vào method | Theo giá trị (copy) | Theo tham chiếu |
| Kế thừa | Không (trừ interface) | Có |
| Có thể là null | Không (chỉ Nullable) | Có |
| Mặc định | Tự động khởi tạo tất cả field bằng 0 | Chỉ qua constructor |
2. Khai báo và sử dụng struct
Bạn có thể khai báo struct bên trong hoặc ngoài class:
struct Rectangle
{
public int Width;
public int Height;
}
Tạo và sử dụng:
Rectangle r;
r.Width = 10;
r.Height = 5;
Console.WriteLine($"Diện tích: {r.Width * r.Height}");
Bạn cũng có thể dùng constructor:
struct Point
{
public int X;
public int Y;
// Constructor
public Point(int x, int y)
{
X = x;
Y = y;
}
}
var p = new Point(3, 7);
Console.WriteLine($"Điểm: ({p.X}, {p.Y})");
Khi nào nên dùng struct?
- Cho các “bộ” dữ liệu nhỏ (ví dụ: tọa độ, màu sắc, khoảng, ngày giờ).
- Khi cần tối ưu kích thước và hiệu năng (ví dụ: hàng triệu điểm trong mảng).
- Khi object cần hành xử như một giá trị duy nhất (copy-paste — là copy thật sự!).
Không nên dùng struct nếu object:
- Có thể lớn (nhiều field).
- Cần tham gia vào hệ thống kế thừa.
- Cần thường xuyên thay đổi qua tham chiếu.
3. Đặc điểm và “bẫy” của struct
Copy
Point p1 = new Point(1, 2);
Point p2 = p1; // tạo ra BẢN SAO!
p2.X = 100;
Console.WriteLine(p1.X); // 1 — không đổi!
Console.WriteLine(p2.X); // 100
Giá trị mặc định ngầm định
Point p; // field X và Y = 0, dù chưa gán giá trị!
Có thể là Nullable
Để lưu null, bạn cần dùng cú pháp nullable — thêm dấu hỏi sau tên kiểu. Khi đó, biến có thể nhận null.
Point? p = null;
if (p == null)
Console.WriteLine("Không có điểm");
4. Struct với auto property và method
Struct có thể có method, property, event và cả static member.
public struct Range
{
public int Start { get; set; }
public int End { get; set; }
public int Length => End - Start;
public override string ToString() => $"[{Start}..{End}]";
}
Ví dụ: struct cho số phức
Struct cho số phức với method và override ToString()
struct Complex
{
public double Re;
public double Im;
public Complex(double re, double im)
{
Re = re;
Im = im;
}
public double Abs() => Math.Sqrt(Re * Re + Im * Im);
public override string ToString() => $"{Re} + {Im}i";
}
var z = new Complex(1, 2);
Console.WriteLine(z); // 1 + 2i
Console.WriteLine(z.Abs()); // 2.236...
GO TO FULL VERSION