Menu
CoddyTech

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.

challenge icon

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ớp ServerConfig trong không gian tên Settings để 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 Port vớ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ề true nế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
  • Program.cs: Trong tệp chính, tạo một đối tượng ServerConfig bằ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: True

Tự 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}
    }
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C# online