|
|
連載:[完全版]究極のC#プログラミング
Chapter13 自動実装と自動定義
川俣 晶
2010/02/17 |
|
|
13.3 自動実装プロパティのアクセス制御
前掲の「リスト13.4 通常のプロパティ定義」と「リスト13.5 自動実装されるプロパティ定義」は完全に同等ではない。最大の相違は、自動実装されるフィールド(「バッキングフィールド」(Backing Field)と呼ぶ)にアクセスできない点にある。
このため、次のリスト13.6のようなコードは、ストレートに自動実装プロパティに書き換えることができない。「a」に相当するフィールドにはアクセスできなくなるため、「Console.WriteLine(a);」がコンパイルできなくなるのである。
class SomeClass
{
private int a = 0;
public int A
{
set { a = value; }
}
public void WriteA()
{
Console.WriteLine(a);
}
}
|
|
リスト13.6 フィールドにアクセスするので自動実装プロパティが使えない例 |
しかしながら、この特徴は少なくとも1つのメリットをもたらす。大文字の名前と小文字の名前*8を使い分けることができない日本語名を使った場合でも、問題なく自動実装プロパティを使用できるのである(リスト13.7参照)。
class SomeClass
{
public int 日本語名 { get; set; }
}
|
|
リスト13.7 日本語名で自動実装プロパティを使用する |
では、リスト13.6に相当するコードは、自動実装プロパティを使用した場合は実現できないのだろうか?
この問題については、「プロパティのgetはprivateに、setはpublicにできるか?」と読み替えれば可能となる。次のリスト13.8は、プロパティのgetアクセサとsetアクセサに対して別のアクセシビリティを指定した例である。このプロパティAは、クラス内からは読み出せるが、クラス外からは読み出せない。しかし、クラス外からの書き込みはできる。
class SomeClass
{
public int A { private get; set; }
public void WriteA()
{
Console.WriteLine(A);
}
}
|
|
リスト13.8 getアクセサはprivate、setアクセサはpublic |
完全に等価ではないが、これで同等の機能を発揮するコードを記述することができた。
*8 C#ではフィールドに小文字の名前を使い、対応するプロパティには、その先頭1文字を大文字にした名前を使うことが多い。これは、privateメンバーは先頭を小文字に、publicメンバーは先頭を大文字にするルールを摘要することで発生する必然的な状況である。 |
Insider.NET 記事ランキング
本日
月間