プロパティの概要
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 の [プロパティ] ウィンドウでは、プロパティを展開してそのサブプロパティを表示できます。
プロパティに属性を追加して、デザイン時にプロパティがプロパティ ブラウザーに適切に表示されるようにする必要があります。 詳細については、「コンポーネントのデザイン時属性」を参照してください。
プロパティはバージョン管理やデータ隠ぺいが可能で、アクセサー メソッドは追加のロジックを実行できるため、コンポーネントからは、パブリック フィールドではなくプロパティを公開する必要があります。 一般に、ジャスト イン タイムで最適化が実行されるため、プロパティとフィールドを使用した場合の負荷はどちらも変わりません。