連載:[完全版]究極のC#プログラミングChapter13 自動実装と自動定義川俣 晶2010/02/17 |
|
|
13.2 自動実装プロパティ
さて、話を最初に巻き戻そう。上記の問題は、「フィールド」と「プロパティ」は等価ではないが、しばしば等価であるかのように扱われるということによって発生した問題である。
その問題の背景には、一部のオブジェクト指向信者が必須の要求として掲げる「アクセサの実装」(ゲッター/セッターのメソッドを用意してフィールドそのものはカプセル化せよ)という非現実的な要求がある。このような要求には、変更に対する対応力の増強という長所があるものの、書くための過大な手間や本質的に何の意味も持たない行がソースコード上に増えてわかりやすさを阻害するなどの短所も多い。
これらに折り合いを付けるための方便として、C#では、まずpublicなフィールドとして記述し、アクセサが必要とされた時点でプロパティに書き換えるというテクニックが使われることがある。このようなテクニックは、たいていの場合、リーズナブルであり有効に機能する。
しかし、フィールドとプロパティは完全に等価ではないため、その部分に引っ掛かると急に破綻してしまう。上記の例はまさにそれである。
では、このような破綻を防ぐにはどうすればよいのだろうか?
もちろん、必ずプロパティでアクセサを付ければよいのである。だが、それは手間がかかりすぎるし、本質的に意味のないコードが増えすぎる。
このジレンマを解決してくれるのが、C# 3.0の「自動実装プロパティ」である。自動実装プロパティは、リスト13.4のように行われる典型的なプロパティの定義を、大幅に簡素化するものである。
| |
リスト13.4 通常のプロパティ定義 |
このリスト13.4とほぼ同等のプロパティを、自動実装プロパティを用いて定義すると、次のリスト13.5のようになる。
| |
リスト13.5 自動実装されるプロパティ定義 |
このように、たった1行になってしまった。
つまり、フィールドの代わりにプロパティを記述する場合、次のようなフィールドの代わりに、
|
次のような自動実装プロパティを記述することで対処できることになる。
|
もちろん、自動実装プロパティではあらゆるプロパティのニーズには対応できないが、それはそれでかまわない。その場合はどのみち記述が長くなるので、従来どおりの長い書き方で実現すればよいからである。
INDEX | ||
[完全版]究極のC#プログラミング | ||
Chapter13 自動実装と自動定義 | ||
1.13.1 ラムダ式を使ったダーティテク―refの代役 | ||
2.13.2 自動実装プロパティ | ||
3.13.3 自動実装プロパティのアクセス制御 | ||
4.13.4 読み出し専用、書き込み専用はない | ||
5.13.5 “名無し”のクラス―匿名型 | ||
6.13.6 匿名型の等価性 | ||
7.13.7 匿名型の簡易記法 | ||
8.13.8 匿名型の使用目的 | ||
9.13.9 オブジェクト初期化子 | ||
10.13.10 オブジェクト初期化子の本質とは? | ||
11.13.11 コレクションはreadonlyでも初期化できる | ||
12.13.12 オブジェクト初期化子の使用例/練習問題 | ||
「[完全版]究極のC#プログラミング」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|