クラスのプロパティ名の後の {get; set;} の記述 (自動実装プロパティ) - C#

クラスのプロパティ名の後ろにある {get; set;} の記述について紹介します。

概要

クラスのプロパティ名(メンバ変数)の後ろにある {get; set;} は自動実装プロパティと呼ばれる機能の書式になります。
get,setの際にロジックが不要の場合はこの書式を利用することでよりシンプルな記述でプロパティを宣言できます。

書式

自動実装プロパティの書式は以下の通りです。
(アクセス識別子) (型名) (プロパティ名) {(アクセス識別子) get; (アクセス識別子) set;}
アクセス識別子は省略できますので
(アクセス識別子) (型名) (プロパティ名) {(アクセス識別子) get; set;}
(アクセス識別子) (型名) (プロパティ名) { get; (アクセス識別子) set;}
(アクセス識別子) (型名) (プロパティ名) { get; set;}
といった記述も可能です。

記述例

  public string caption { get; set; }
  public int count { get; private set; }

プログラム例

UI

下記のUIを作成します。Windows Formアプリケーションを作成し、TextBoxを2つ、ButtonとLabelを1つずつ配置します。

コード

下記のコードを記述します。新しいクラス(MyClass)を追加して、MyClass.cs を実装します。
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleAutoImplementedProperty
{
  public class MyClass
  {
    public int value1 { get; set; }
    public int value2 { get; set; }
    public int result { get; private set; }

    public void Proc()
    {
      result = value1 + value2;
    }
  }
}

フォームのコードは下記になります。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SimpleAutoImplementedProperty
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      int a = Convert.ToInt32(textBox1.Text);
      int b = Convert.ToInt32(textBox2.Text);
      MyClass mc = new MyClass();
      mc.value1 = a;
      mc.value2 = b;

      mc.Proc();

      int c = mc.result;
      label1.Text = c.ToString();
    }
  }
}

解説

下記のコードが自動実装のプロパティになります。 value1, value2 プロパティはpublicで宣言されており、get, set にアクセス識別子が主略されているため、クラス外から参照も代入も可能なpublicなプロパティとして宣言されています。
一方、resultプロパティはpublicで宣言されていますが、setにはprivate のアクセス識別子が記述されているため、クラス外から参照はできるが代入はできない読み取り専用プロパティとして宣言されています。
  public int value1 { get; set; }
  public int value2 { get; set; }
  public int result { get; private set; }

フォームに配置したボタンがクリックされると、下記のコードが実行されます。
textBox1, textBox2 のテキストボックスに入力された文字列を数値に変換して、a, b の変数に代入します。続いて、MyClass型のオブジェクト mc を宣言し、MyClassのインスタンスを作成します。作成したmc オブジェクトのvalue1プロパティに変数aの値を代入し、value2プロパティには変数bの値を代入します。
代入後、mcオブジェクトの Proc() メソッドを実行し処理を実行します。計算結果は、mcオブジェクトのresultプロパティに設定されるため、mcオブジェクトのresultプロパティの値を参照し変数cに代入します。変数cの値をlabel1に表示して画面に演算結果を表示します。
    private void button1_Click(object sender, EventArgs e)
    {
      int a = Convert.ToInt32(textBox1.Text);
      int b = Convert.ToInt32(textBox2.Text);
      MyClass mc = new MyClass();
      mc.value1 = a;
      mc.value2 = b;

      mc.Proc();

      int c = mc.result;
      label1.Text = c.ToString();
    }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


テキストボックスに数値を入力します。今回は、8 と 14 を入力します。


[button1]をクリックします。label に 8と14の和である、22が表示されます。

補足: 自動実装プロパティを利用しない場合

自動実装プロパティを利用しない場合 MyClass.cs は下記のコードとなります。自動実装プロパティを利用することで記述がシンプルになることと、値を保持するクラスのメンバ変数が不要になるメリットがあります。
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleAutoImplementedProperty
{
  public class MyClass
  {
    private int ivalue1;
    private int ivalue2;
    private int iresult;

    public int value1
    {
      get
      {
        return ivalue1;
       
      }
      set {
        ivalue1 = value;
      }
    }

    public int value2
    {
      get
      {
        return ivalue2;

      }
      set
      {
        ivalue2 = value;
      }
    }

    public int result
    {
      get
      {
        return iresult;
      }
    }

    public void Proc()
    {
      iresult = ivalue1 + ivalue2;
    }
  }
}
補足:自動実装プロパティが利用できない場合
自動実装プロパティはメンバ変数への単純な代入、参照の場合のみ利用できます。プロパティへの値の設定時に値の範囲チェックや何らかの処理を実行する場合は自動実装プロパティは利用できないため、通常のプロパティの記述をする必要があります。

このページのキーワード
  • {get; set;}
  • プロパティ get set
  • get set
  • 自動実装プロパティ
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2018-01-10
iPentec all rights reserverd.