本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第1章 オブジェクト指向 · レッスン2

フィールドとプロパティ

ブラウザで完結

導入

クラスが持つデータをフィールドと呼びます。しかしフィールドを外部に直接さらすと、不正な値を入れられてしまいます。そこでプロパティを使い、読み書きに検査や制御を挟めるようにします。

図解

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を見る

サンプルのBankAccountBalanceと同じ構造です

ヒント2を見る

class Product { private int _price; public int Price { get => _price; set { if (value >= 0) _price = value; } } }

まとめ

  • フィールドはデータの実体(privateで隠す)
  • プロパティはget/setで読み書きを仲介する
  • setでの検査により不正な値を防げる

次回: オブジェクト生成時に初期化する「コンストラクタ」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。