読み取り専用・書き込み専用プロパティ
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 11/70。
読み取りのみ、または書き込みのみが可能なプロパティが必要になることがあります。個々のアクセサーに private を使用することで、これを制御できます。
読み取り専用プロパティには public getter がありますが、private setter(または setter がまったくありません)があります。
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}外部のコードはUsernameを読み取れますが、変更できるのはクラス自身だけです。これは、構築時に一度だけ設定する値に便利です。
書き込み専用プロパティにはpublicなsetterがありますが、privateな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; のみを持つプロパティは、constructor または宣言時にのみ代入でき、object の作成後は変更できません。
チャレンジ
簡単機密データを保護するために、読み取り専用および書き込み専用の property をいつ使用するかを示す、安全な構成システムを構築しましょう。
コードを整理するために、2つのファイルを作成します。
Config.cs:Settingsnamespace に、server の構成を管理するServerConfigclass を定義します。次の要素を含めます。- read-only property
ServerName(constructor でのみ設定可能) - private setter を持つ read-only property
Port(constructor で設定) - secret key を internally に stores する write-only property
ApiKey - 提供された key が stored された key と matches する場合に
trueを returns する methodValidateApiKey(string key) - server name と port を accepts する constructor
- read-only property
Program.cs: Main file で、input values を使用してServerConfigobject を作成し、API key を設定してから、test key に対して検証します。
4つの inputs を受け取ります。
- Server name
- Port number
- store する API key
- 検証する API key
server の詳細と検証結果を、次の Format で print します。
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}たとえば、inputs が MainServer、8080、secret123、secret123 の場合、output は次のようになります。
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 キーを検証して結果を出力する
// 形式: Server: {ServerName}, Port: {Port}
// API Key Valid: {True/False}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: C#オンラインコンパイラ