|
|
連載:[完全版]究極のC#プログラミング
Chapter13 自動実装と自動定義
川俣 晶
2010/02/17 |
 |
|
13.2 自動実装プロパティ
さて、話を最初に巻き戻そう。上記の問題は、「フィールド」と「プロパティ」は等価ではないが、しばしば等価であるかのように扱われるということによって発生した問題である。
その問題の背景には、一部のオブジェクト指向信者が必須の要求として掲げる「アクセサの実装」(ゲッター/セッターのメソッドを用意してフィールドそのものはカプセル化せよ)という非現実的な要求がある。このような要求には、変更に対する対応力の増強という長所があるものの、書くための過大な手間や本質的に何の意味も持たない行がソースコード上に増えてわかりやすさを阻害するなどの短所も多い。
これらに折り合いを付けるための方便として、C#では、まずpublicなフィールドとして記述し、アクセサが必要とされた時点でプロパティに書き換えるというテクニックが使われることがある。このようなテクニックは、たいていの場合、リーズナブルであり有効に機能する。
しかし、フィールドとプロパティは完全に等価ではないため、その部分に引っ掛かると急に破綻してしまう。上記の例はまさにそれである。
では、このような破綻を防ぐにはどうすればよいのだろうか?
もちろん、必ずプロパティでアクセサを付ければよいのである。だが、それは手間がかかりすぎるし、本質的に意味のないコードが増えすぎる。
このジレンマを解決してくれるのが、C# 3.0の「自動実装プロパティ」である。自動実装プロパティは、リスト13.4のように行われる典型的なプロパティの定義を、大幅に簡素化するものである。
class SomeClass
{
private int a;
public int A
{
get { return a; }
set { a = value; }
}
}
|
|
リスト13.4 通常のプロパティ定義 |
このリスト13.4とほぼ同等のプロパティを、自動実装プロパティを用いて定義すると、次のリスト13.5のようになる。
class SomeClass
{
public int A { get; set; }
}
|
|
リスト13.5 自動実装されるプロパティ定義 |
このように、たった1行になってしまった。
つまり、フィールドの代わりにプロパティを記述する場合、次のようなフィールドの代わりに、
次のような自動実装プロパティを記述することで対処できることになる。
public int A { get; set; }
|
|
もちろん、自動実装プロパティではあらゆるプロパティのニーズには対応できないが、それはそれでかまわない。その場合はどのみち記述が長くなるので、従来どおりの長い書き方で実現すればよいからである。
Insider.NET 記事ランキング
本日
月間