CodeGym /Các khóa học /C# SELF /Các struct trong C#

Các struct trong C#

C# SELF
Mức độ, Bài học
Có sẵn

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;
}
Khai báo struct Point

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
struct
class
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
Copy struct tạo ra bản sao độc lập

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...
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Tạo một struct đơn giản để lưu trữ tọa độ điểm
Tạo một struct đơn giản để lưu trữ tọa độ điểm
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Struct với constructor và phương thức tính diện tích
Struct với constructor và phương thức tính diện tích
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION