Trường lưu trữ
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 17 trên 70.
Các thuộc tính được triển khai tự động rất tiện lợi, nhưng đôi khi bạn cần kiểm soát nhiều hơn cách một thuộc tính lưu trữ hoặc lấy giá trị. Đây là lúc trường hỗ trợ phát huy tác dụng. Trường hỗ trợ là một trường riêng tư lưu trữ dữ liệu thực tế cho một thuộc tính.
public class Product
{
private decimal _price; // Trường lưu trữ giá trị
public decimal Price
{
get { return _price; }
set { _price = value; }
}
}Việc này có vẻ tốn công hơn so với thuộc tính tự động, nhưng trường hỗ trợ cho phép bạn thêm logic. Ví dụ, bạn có thể xác thực dữ liệu trước khi lưu:
public class Product
{
private decimal _price;
public decimal Price
{
get => _price;
set => _price = value < 0 ? 0 : value;
}
}Giờ đây, giá âm sẽ tự động trở thành 0. Bạn cũng có thể chuyển đổi dữ liệu khi đọc hoặc ghi, ghi lại các thay đổi hoặc kích hoạt những hành động khác.
Quy ước đặt tên trường hỗ trợ thường dùng tiền tố gạch dưới (_price) hoặc chữ thường (price) để phân biệt trường này với thuộc tính.
Khi dùng thuộc tính tự động như public decimal Price { get; set; }, trình biên dịch thực sự tạo một trường hỗ trợ ẩn cho bạn. Trường hỗ trợ tường minh cung cấp cùng kiểu lưu trữ, đồng thời cho bạn toàn quyền kiểm soát hành vi.
Thử thách
DễHãy xây dựng một hệ thống cảm biến nhiệt độ sử dụng các trường hỗ trợ (backing field) để kiểm tra và chuyển đổi dữ liệu khi lưu trữ và truy xuất.
Bạn sẽ tạo hai tệp để sắp xếp code:
TemperatureSensor.cs: Định nghĩa lớpTemperatureSensortrong không gian tênSensors. Cảm biến này đo nhiệt độ theo độ C, nhưng ta cần đảm bảo các số đo nằm trong giới hạn hợp lệ. Dùng các trường hỗ trợ để triển khai những yêu cầu sau:- Thuộc tính
Location(chuỗi) có trường hỗ trợ_location. Khi đặt vị trí, nếu giá trị là null hoặc rỗng, hãy lưu"Unknown"thay thế. - Thuộc tính
Temperature(double) có trường hỗ trợ_temperature. Khi đặt nhiệt độ, giới hạn giá trị trong khoảng từ-50đến150(nếu thấp hơn -50, lưu -50; nếu cao hơn 150, lưu 150). - Thuộc tính chỉ đọc
TemperatureFahrenheittính toán và trả về nhiệt độ theo độ F bằng công thức:(celsius * 9 / 5) + 32. Thuộc tính này cần sử dụng trực tiếp trường hỗ trợ. - Một hàm khởi tạo nhận giá trị vị trí và nhiệt độ ban đầu.
- Thuộc tính
Program.cs: Trong tệp chính, tạo cảm biến bằng các giá trị đầu vào và hiển thị số đo. Sau đó, cập nhật nhiệt độ bằng giá trị đầu vào thứ hai và hiển thị số đo đã cập nhật.
Bạn sẽ nhận ba giá trị đầu vào:
- Vị trí cảm biến
- Số đo nhiệt độ ban đầu
- Số đo nhiệt độ đã cập nhật
In đầu ra theo định dạng sau:
Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)Ví dụ, nếu các giá trị đầu vào là Lab Room, 25 và 200, đầu ra sẽ là:
Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)Lưu ý rằng số đo thứ hai 200 bị giới hạn xuống 150 vì vượt quá nhiệt độ tối đa hợp lệ. Các trường hỗ trợ giúp bạn kiểm soát cách lưu trữ dữ liệu!
Tự làm thử
using System;
using Sensors;
class Program
{
public static void Main(string[] args)
{
// Đọc các giá trị đầu vào
string location = Console.ReadLine();
double initialTemp = Convert.ToDouble(Console.ReadLine());
double updatedTemp = Convert.ToDouble(Console.ReadLine());
// TODO: Tạo TemperatureSensor với vị trí và nhiệt độ ban đầu
// TODO: In ra vị trí và các giá trị nhiệt độ ban đầu của cảm biến
// Định dạng: "Sensor: {Location}"
// Định dạng: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
// TODO: Cập nhật nhiệt độ của cảm biến bằng giá trị mới
// TODO: In ra các giá trị nhiệt độ sau khi cập nhật
// Định dạng: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợpTự luyện tập: Trình biên dịch C# online