C#文法リファレンス - 自動実装プロパティ
単純なプロパティを簡潔に記述できます。
使用に適した状況
単純なプロパティを記述する際に、他のコードを読みやすいようにしたい場合。プロテクトフィールドに直接アクセスする習慣を防ぎたい場合。
サンプル
/*----------------------------------------------------
*
* 自動実装プロパティ
*
----------------------------------------------------*/
using System;
class Foo
{
//通常の方式
private int _normal;
public int NormalProperty
{
get { return this._normal; }
set { this._normal = value; }
}
#region 自動実装プロパティ
//読み書き可能
public int Property { get; set; }
//読み取り専用
public int ReadOnlyProperty { get; private set; }
//書き込み専用
public int WriteOnlyProperty { private get; set; }
#endregion
}
class Sample
{
public static void Main()
{
//読み書き可能
Foo obj = new Foo( );
obj.Property = 10;
Console.WriteLine( "プロパティの値:{0}", obj.Property );
//書き込み禁止
//obj.ReadOnlyProperty = 10;
//読み込み禁止
//int i = obj.WriteOnlyProperty;
//終了
Console.ReadLine( );
}
}
文法
プロパティ内のセッターとゲッターに、コードを記述せず「 ; 」記号を書きます。どちらか片方だけ自走実装にすることはできません。
解説
フィールド代わりに記述するプロパティは、書き方が定型的であり、数が多くなると面倒になります。面倒なだけならばいいのですが、定型的で単純なプロパティの数が多くなると、無駄に行数が増え、他の注目するべきコードが埋もれてしまいます。自動実装プロパティを使用すると、一目で注目するべき内容の実装のないプロパティであることがわかります。それにより、他の注目するべきコードが読みやすくなります。
自動実装プロパティは基本的に、直接フィールドにアクセスできません。その事から、コーディングルールを強制するのにも役立ちます。経験がないと分かりにくいと思いますが、アクセス修飾子をprotectedにしてフィールドを宣言し。子クラスはそのプロテクトフィールドを操作するという形式にするかどうかもめることがあります。その行為をする主な理由は、フィールドの方がパフォーマンスが良いというものです。しかしながら、昔よりもコンパイラの最適化能力は進化しており、適切なコードを生成するようになっています。特にC#の場合、かなり洗礼されており、そのような小手先のパフォーマンス向上テクニックは必要ありません。また、その行為はカプセル化の原則に反しています。自動実装プロパティを使用すると、直接フィールドにアクセスさせるスタイルを防ぐことができます。