プロパティの概要
更新 : 2007 年 11 月
Visual Studio などのビジュアル デザイナのプロパティ ブラウザには、フィールドではなくプロパティが表示されるため、コンポーネントにはパブリック フィールドではなく、プロパティを定義する必要があります。プロパティを定義するその他の理由については、このトピックの最後にリストを示します。
プロパティは、スマート フィールドに似ています。プロパティは、一般的に、アクセサを伴うプライベート データ メンバを持ち、構文上はクラスのフィールドとしてアクセスされます。プロパティにはいくつかのアクセス レベルがありますが、ここではパブリック アクセスのより一般的な場合だけを取り上げます。プロパティはこれまでも Visual Basic のいくつかのエディションで使用されてきたので、Visual Basic プログラマはこのトピックを読み飛ばしてもかまいません。
プロパティの定義は、一般に次の 2 つの部分から構成されています。
プライベート データ メンバの定義。
private int number = 0;
Private number As Integer = 0
プロパティ宣言構文によるパブリック プロパティの定義。この構文では、get アクセサと set アクセサの各機能を使って、プライベート データ メンバとパブリック プロパティを関連付けています。
public int MyNumber { // Retrieves the number data member. get { return number; } // Assigns to the number data member. set { number = value; } }
Public Property MyNumber As Integer ' Retrieves number. Get Return number End Get ' Assigns to number. Set number = value End Set End Property
value という語は、プロパティを定義する構文のキーワードです。変数 value は、呼び出し元コードのプロパティに割り当てられます。value の型は、それが代入されるプロパティで宣言された型と同じである必要があります。
プロパティ定義には通常はプライベート データ メンバが含まれていますが、これは必須ではありません。get アクセサは、プライベート データ メンバにアクセスせずに値を返すことができます。その例としては、get メソッドでシステム時刻を返すプロパティがあります。プロパティは、データの隠ぺいを可能にします。アクセサ メソッドは、プロパティの実装を隠ぺいします。
プロパティ構文には、プログラミング言語によっていくつかの相違があります。たとえば、property という用語は C# ではキーワードではありませんが、Visual Basic ではキーワードです。言語固有の情報については、その言語のドキュメントを参照してください。
SimpleProperty クラスに MyNumber というプロパティを定義し、UsesSimpleProperty クラスから MyNumber にアクセスする例を次に示します。
public class SimpleProperty
{
private int number = 0;
public int MyNumber
{
// Retrieves the data member number.
get
{
return number;
}
// Assigns to the data member number.
set
{
number = value;
}
}
// Other members.
}
public class UsesSimpleProperty
{
public static void Main()
{
SimpleProperty example = new SimpleProperty();
// Sets the property.
example.MyNumber = 5;
// Gets the property.
int anumber = example.MyNumber;
}
}
Public Class SimpleProperty
Private number As Integer = 0
Public Property MyNumber As Integer
' Retrieves number.
Get
Return number
End Get
' Assigns to number.
Set
number = value
End Set
End Property
' Other members...
End Class
Public Class UsesSimpleProperty
Public Shared Sub Main()
Dim example As New SimpleProperty()
' Sets the property.
example.MyNumber = 5
' Gets the property.
Dim anumber As Integer = example.MyNumber
End Sub
End Class
get メソッドと set メソッドは、基本的にほかのメソッドと変わりありません。どちらのメソッドも、プログラム ロジックを実行したり、例外をスローしたりできます。また、これらのメソッドをオーバーライドしたり、プログラミング言語で使用可能な修飾子を付けて宣言したりすることもできます。ただし、プロパティは静的な場合があることに注意してください。プロパティが静的である場合は、get メソッドおよび set メソッドの機能に制約が生じます。詳細については、使用するプログラミング言語のリファレンスを参照してください。
プロパティの型は、プリミティブ型、プリミティブ型のコレクション、ユーザー定義の型、またはユーザー定義の型のコレクションです。.NET Framework には、すべてのプリミティブ型について、文字列から値に変換するための型コンバータが用意されています。詳細については、「一般的な型変換」を参照してください。プロパティに対して適用できる型コンバータは、デザイナのプロパティ ブラウザに表示できます。カスタム プロパティを定義して、それらをプロパティ ブラウザに表示するには、カスタム型コンバータを実装する必要があります。
プロパティのデータ型が列挙型の場合、Microsoft Visual Studio などの開発環境では、そのプロパティは [プロパティ] ウィンドウにドロップダウン リストとして表示されます。プロパティのデータ型が、いくつかのプロパティを持つクラスである場合、クラスに含まれているこれらのプロパティは、定義するプロパティのサブプロパティと呼ばれます。Visual Studio の [プロパティ] ウィンドウでは、プロパティを展開してそのサブプロパティを表示できます。
プロパティに属性を追加して、デザイン時にプロパティがプロパティ ブラウザに適切に表示されるようにする必要があります。詳細については、「コンポーネントのデザイン時属性」を参照してください。
プロパティはバージョン管理やデータ隠ぺいが可能で、アクセサ メソッドは追加のロジックを実行できるため、コンポーネントからは、パブリック フィールドではなくプロパティを公開する必要があります。一般に、ジャスト イン タイムで最適化が実行されるため、プロパティとフィールドを使用した場合の負荷はどちらも変わりません。