Thuộc tính chỉ đọc hoặc chỉ ghi
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 11 trên 70.
Đôi khi, bạn cần các thuộc tính chỉ có thể đọc hoặc chỉ có thể ghi. Bạn có thể kiểm soát điều này bằng cách dùng private trên từng phương thức truy cập.
thuộc tính chỉ đọc có getter công khai nhưng setter riêng tư (hoặc không có setter):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}Code bên ngoài có thể đọc Username, nhưng chỉ lớp đó mới có thể thay đổi giá trị này. Điều này hữu ích với những giá trị chỉ nên được thiết lập một lần khi khởi tạo.
Thuộc tính chỉ ghi có setter công khai nhưng getter riêng tư:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Các thuộc tính chỉ ghi khá hiếm gặp nhưng hữu ích với dữ liệu nhạy cảm như mật khẩu, khi bạn muốn nhận đầu vào mà không để lộ giá trị đã lưu.
Bạn cũng có thể tạo các thuộc tính chỉ đọc thực sự với getter:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}Các thuộc tính chỉ có get; chỉ có thể được gán trong hàm khởi tạo hoặc khi khai báo, nên không thể thay đổi sau khi đối tượng được tạo.
Thử thách
DễHãy xây dựng một hệ thống cấu hình an toàn để minh họa khi nào nên dùng thuộc tính chỉ đọc và chỉ ghi nhằm bảo vệ dữ liệu nhạy cảm.
Bạn sẽ tạo hai tệp để sắp xếp code:
Config.cs: Định nghĩa lớpServerConfigtrong không gian tênSettingsđể quản lý cấu hình máy chủ. Lớp này cần có:- Thuộc tính chỉ đọc
ServerName(chỉ có thể thiết lập trong hàm khởi tạo) - Thuộc tính chỉ đọc
Portvới hàm thiết lập riêng tư (thiết lập thông qua hàm khởi tạo) - Thuộc tính chỉ ghi
ApiKeyđể lưu khóa bí mật bên trong - Phương thức
ValidateApiKey(string key)trả vềtruenếu khóa được cung cấp khớp với khóa đã lưu - Hàm khởi tạo nhận tên máy chủ và cổng
- Thuộc tính chỉ đọc
Program.cs: Trong tệp chính, tạo một đối tượngServerConfigbằng các giá trị đầu vào, thiết lập khóa API, rồi xác thực khóa đó với một khóa kiểm tra.
Bạn sẽ nhận bốn giá trị đầu vào:
- Tên máy chủ
- Số cổng
- Khóa API cần lưu
- Khóa API cần xác thực
In thông tin máy chủ và kết quả xác thực theo định dạng sau:
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}Ví dụ, nếu các giá trị đầu vào là MainServer, 8080, secret123 và secret123, kết quả đầu ra sẽ là:
Server: MainServer, Port: 8080
API Key Valid: TrueTự làm thử
using System;
using Settings;
class Program
{
public static void Main(string[] args)
{
// Đọc các đầu vào
string serverName = Console.ReadLine();
int port = Convert.ToInt32(Console.ReadLine());
string apiKeyToStore = Console.ReadLine();
string apiKeyToValidate = Console.ReadLine();
// TODO: Tạo đối tượng ServerConfig với serverName và port
// TODO: Thiết lập khóa API bằng thuộc tính chỉ ghi
// TODO: Kiểm tra tính hợp lệ của khóa API và in kết quả
// Định dạng: Máy chủ: {ServerName}, Cổng: {Port}
// API Key Valid: {True/False}
}
}
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