Menu
CoddyTech

只读和只写属性

本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 11 课,共 70 课。

有时,你需要只能读取或只能写入的属性。你可以在单个访问器上使用 private 来控制这一点。

只读属性有一个公有的 getter,但 setter 是私有的(或者根本没有 setter):

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

外部代码可以读取 Username,但只有类本身可以修改它。这适用于应在构造时只设置一次的值。

只写属性有公共 setter,但 getter 是私有的:

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

只写属性虽然少见,但对密码这类敏感数据很有用,因为你可以接收输入,而不暴露已存储的值。

你也可以只使用 getter 创建真正的只读属性:

public class Circle
{
    public double Radius { get; }
    public double Area => Math.PI * Radius * Radius;
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

只包含 get; 的属性只能在构造函数中或声明时赋值,因此对象创建后它们不可变。

challenge icon

挑战

简单

让我们构建一个安全的配置系统,演示何时使用只读属性和只写属性来保护敏感数据。

你将创建两个文件来整理代码:

  • Config.cs:在 Settings 命名空间中定义一个管理服务器配置的 ServerConfig 类。它应包含:
    • 只读属性 ServerName(只能在构造函数中设置)
    • 带有私有 setter 的只读属性 Port(通过构造函数设置)
    • 只写属性 ApiKey,用于在内部存储密钥
    • 方法 ValidateApiKey(string key),如果提供的密钥与存储的密钥匹配,则返回 true
    • 一个接受服务器名称和端口的构造函数
  • Program.cs:在主文件中,使用输入值创建一个 ServerConfig 对象,设置 API 密钥,然后用测试密钥进行验证。

你将收到 4 个输入:

  • 服务器名称
  • 端口号
  • 要存储的 API 密钥
  • 要验证的 API 密钥

按以下格式输出服务器详细信息和验证结果:

Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}

例如,如果输入是 MainServer、8080、secret123 和 secret123,输出应为:

Server: MainServer, Port: 8080
API Key Valid: True

亲手试试

using System;
using Settings;

class Program
{
    public static void Main(string[] args)
    {
        // 读取输入
        string serverName = Console.ReadLine();
        int port = Convert.ToInt32(Console.ReadLine());
        string apiKeyToStore = Console.ReadLine();
        string apiKeyToValidate = Console.ReadLine();

        // TODO: 使用 serverName 和 port 创建 ServerConfig 对象

        // TODO: 使用只写属性设置 API 密钥

        // TODO: 验证 API 密钥并输出结果
        // 格式:服务器:{ServerName},端口:{Port}
        //         API Key Valid: {True/False}
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C# 在线编译器