VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
C# CoreClass cơ bản
Bài 11/19
5 phút

Property và constructor

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Ở bài trước, tạo một sản phẩm tốn ba dòng: new, gán tên, gán giá. Quên một dòng là có sản phẩm không tên. Bài này dùng constructor để bắt buộc truyền đủ dữ liệu lúc tạo, và property để quyết định phần nào được sửa về sau.

Khái niệm

🔐 Property: thành viên của class dùng như field, nhưng quy định được ai đọc và ai ghi qua get và set.

🏗️ Constructor: method đặc biệt trùng tên class, tự chạy khi gọi new, dùng để gán giá trị ban đầu.

Ví dụ

var pen = new Product("Bút bi", 5000m);
pen.Stock = 120;

Console.WriteLine($"{pen.Name}: {pen.Price}đ");
Console.WriteLine(pen.Stock);

class Product
{
    public string Name { get; }
    public decimal Price { get; }
    public int Stock { get; set; }

    public Product(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
}
  • { get; set; }: đọc và ghi được từ bên ngoài, như Stock.
  • { get; }: bên ngoài chỉ đọc được. Chỉ constructor mới gán được, như Name và Price.
  • Constructor không có kiểu trả về, tên trùng với tên class.
  • Class có constructor nhận tham số thì new Product() không còn dùng được. Muốn tạo sản phẩm thì phải truyền đủ tên và giá.

Theo quy ước, property viết hoa chữ cái đầu (Price), tham số viết thường (price).

Thử ngay

Chép ví dụ trên vào Program.cs. Thêm dòng in sau vào đầu constructor, rồi thay các dòng gọi ở đầu file bằng đoạn dưới:

Console.WriteLine($"Tạo sản phẩm: {name}");
Console.WriteLine("Bắt đầu");
var pen = new Product("Bút bi", 5000m);
var book = new Product("Vở", 12000m);
Console.WriteLine("Kết thúc");

Đoán trước khi chạy: dòng "Tạo sản phẩm" in ra mấy lần, và nằm ở đâu?

Xem kết quả
Bắt đầu
Tạo sản phẩm: Bút bi
Tạo sản phẩm: Vở
Kết thúc

Hai lần, mỗi lần gọi new in một lần. Constructor chạy đúng lúc object được tạo.

Lỗi hay gặp

Gán property chỉ có get. Compiler chặn ngay.

// SAI — lỗi compile: Price chỉ đọc được
var pen = new Product("Bút bi", 5000m);
pen.Price = 4000m;
// ĐÚNG — truyền giá đúng ngay lúc tạo
var pen = new Product("Bút bi", 4000m);

Muốn cho sửa giá thì phải khai báo { get; set; }. Để { get; } nghĩa là giá đã chốt từ lúc tạo.

Gán tham số cho chính nó. Tên tham số trùng tên property, chỉ khác hoa thường, rất dễ gõ nhầm.

// SAI — gán price cho price, Price vẫn là 0
class Item
{
    public decimal Price { get; set; }

    public Item(decimal price)
    {
        price = price;
    }
}
// ĐÚNG — vế trái là property Price viết hoa
class Item
{
    public decimal Price { get; set; }

    public Item(decimal price)
    {
        Price = price;
    }
}

Tóm tắt

  • Property thay cho field public: { get; set; } đọc ghi, { get; } chỉ đọc.
  • Constructor trùng tên class, chạy khi new, gán giá trị ban đầu.
  • Constructor có tham số bắt người tạo object phải truyền đủ dữ liệu.
  • Trong constructor, vế trái là property (Price), vế phải là tham số (price).

Tự kiểm tra

0/3 câu
Câu 1

Class Customer có property public string Email { get; } và constructor gán Email. Dòng customer.Email = "moi@shop.vn"; thì sao?

Câu 2

Class Order chỉ có constructor Order(int id). Dòng var o = new Order(); thì sao?

Câu 3

Property nào nên để { get; set; } thay vì { get; }?

Class và objectValue type và reference type

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt