C#は他の言語と異なりget/setアクセサを使ってプロパティを構築することができます。
今回は実例を交えてget/setを利用したプロパティについて解説していきます。
C#のプロパティとは?
C#のプロパティはget/setアクセサを使って実装したものです。
こうすることでクラス内部ではメソッドのように振る舞い、インスタンスを生成する側から見るとメンバー変数のように扱うことができます。
これはC++やJavaにはない概念なので最初のうちは違和感が出てくるかもしれません。
get/setアクセサを利用したコード
using System;
namespace PropertyTest
{
class Program
{
static void Main(string[] args)
{
Ramen ramen = new Ramen();
Console.WriteLine("変更前のラーメンは:{0}", ramen.Name);
// 名前を変更する
ramen.Name = "富田";
Console.WriteLine("変更後のラーメンは:{0}", ramen.Name);
}
}
class Ramen
{
private string name = "中本";
/// <summary>
/// 外部から呼ばれる
/// </summary>
public string Name
{
get
{
return name; // 外部から取得される
}
set
{
name = value; // 外部から設定する
}
}
}
}
実行結果
変更前のラーメンは:中本 変更後のラーメンは:富田 |
C# 3.0以降の自動実装プロパティで簡略化
C# 3.0以降の機能で「自動実装プロパティ(Auto Implemented Properties)」というのがあります。
これは、returnやvalueといったget/setアクセサとセットになっているものを省略可することでコードを簡略化できる機能です。
では実査に自動実装プロパティ適用前と後を比較してみましょう。
自動実装プロパティの適用前
自動実装適用の前後を比較してみましょう。まずは適用前から。
class Ramen
{
private string name = "中本";
/// <summary>
/// 外部から呼ばれる
/// </summary>
public string Name
{
get
{
return name; // 外部から取得される
}
set
{
name = value; // 外部から設定する
}
}
}
自動実装プロパティの適用後
次に自動実装プロパティを適用。
class Ramen
{
/// <summary>
/// 外部から呼ばれる
/// </summary>
public string Name { get; set; } = "中本";
}
コード一行でシンプルになりました。さらに一行になったことで可読性も向上しています。
実行結果
変更前のラーメンは:中本 変更後のラーメンは:富田 |
読み込み専用のプロパティにするには?
ちなみに、setアクセサにprivateを付けることで読み込み専用のプロパティに変身させることができます。
public string Name { get; private set; } = "中本";
このようにsetアクセサにアクセスできない警告が表示されビルドエラーとなりました。

C#でプロパティを生成する便利なコードスニペット
プロパティで値や文字列を手書きで定義するって結構面倒です。
そこで、ショートカットのように手軽にプログラムを実装できる「コードスニペット」という機能が用意されています。
代表的なコードスニペット
プロパティを実装できるコードスニペット
- prop
- propg
- propfull
まずコード上でpropと入力するとコードスニペット一覧が出てくるのでそのままShiftキーを2回押します。

すると、このようにプロパティが実装されてきます。
propのコードスニペット
propのコードスニペットはこちら。
public int MyProperty { get; set; }
propgのコードスニペット
propgのコードスニペットはこちら。
public int MyProperty { get; private set; }
propgでは読み込み専用のプロパティが生成されます。
propfullのコードスニペット
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
propfullは一番王道のプロパティですね。すべてのコードが書かれています。
コメント