只读和只写属性
本课属于 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; 的属性只能在构造函数中或声明时赋值,因此对象创建后它们不可变。
挑战
简单让我们构建一个安全的配置系统,演示何时使用只读属性和只写属性来保护敏感数据。
你将创建两个文件来整理代码:
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}
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器