Property và constructor
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 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ưNamevà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úcHai 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âuClass Customer có property public string Email { get; } và constructor gán Email. Dòng customer.Email = "moi@shop.vn"; thì sao?
Class Order chỉ có constructor Order(int id). Dòng var o = new Order(); thì sao?
Property nào nên để { get; set; } thay vì { get; }?