導入
クラスが持つデータをフィールドと呼びます。しかしフィールドを外部に直接さらすと、不正な値を入れられてしまいます。そこでプロパティを使い、読み書きに検査や制御を挟めるようにします。
図解
flowchart LR
OUT["外部からの代入"] --> P["プロパティ<br/>get / set で仲介"]
P -->|検査してから| F["内部のデータ"]
style P fill:#e8f5e9
サンプル
var account = new BankAccount();
account.Balance = 1000; // set が呼ばれる
Console.WriteLine(account.Balance); // get が呼ばれる → 1000
account.Balance = -500; // set の中で不正値を弾く
Console.WriteLine(account.Balance); // 1000 のまま(変更されない)
class BankAccount
{
private int _balance; // 内部データ(フィールド)は隠す
public int Balance // プロパティ: 外部との窓口
{
get => _balance; // 読み取り
set // 書き込み
{
if (value >= 0) // 不正な値(マイナス)は弾く
_balance = value;
}
}
}
- フィールド(
_balance)はデータの実体。privateで隠すのが基本 - プロパティ(
Balance)はget/setでフィールドへの読み書きを仲介する setの中で検査すれば「不正な値を入れさせない」ことができる- 単純な場合は
public int Age { get; set; }と自動プロパティで書ける
演習
var product = new Product();
product.Price = 500;
product.Price = -100; // 不正なので無視される想定
Console.WriteLine(product.Price);
// TODO: Price プロパティを持つ Product クラスを定義してください。
// set では 0 以上のときだけ値を受け付けてください(期待出力は 500)
___
- 期待される出力:
500
ヒント1を見る
サンプルのBankAccountのBalanceと同じ構造です
ヒント2を見る
class Product { private int _price; public int Price { get => _price; set { if (value >= 0) _price = value; } } }
まとめ
- フィールドはデータの実体(
privateで隠す) - プロパティは
get/setで読み書きを仲介する setでの検査により不正な値を防げる
次回: オブジェクト生成時に初期化する「コンストラクタ」です。