ここでは、Visual Basic 6.0と比較して、VB.NET(及び、C#)のプロパティについて説明します。
Visual Basic 6.0 では、Property Get、Property Let、Property Setの各ステートメントを使用してプロパティの値を取得および設定ができました。また、ByRefプロパティ引数の使用も可能でした。これに対してVB.NETではプロパティ宣言の構文が大きく異なります。例えば、ByRefプロパティ引数の使用は出来なくなりました。下の例を参考にしてください。
Public Class SampleClass 'GetとSetがあるとき Private _number1 As Integer = 0 Public Property Number1() As Integer Get Return _number1 End Get Set(ByVal value As Integer) _number1 = value End Set End Property 'Getしかない時はReadOnlyを付ける Private _number2 As Integer = 0 Public ReadOnly Property Number2() As Integer Get Return _number2 End Get End Property 'Setしかない時はWriteOnlyを付ける Private _number3 As Integer = 0 Public WriteOnly Property Number3() As Integer Set(ByVal value As Integer) _number3 = value End Set End Property End Class
public class SampleClass { //getとsetがあるとき private int _number1 = 0; public int Number1 { get { return _number1; } set { _number1 = value; } } //getしかない時もReadOnlyなどをつける必要はない private int _number2 = 0; public int Number2 { get { return _number2; } } //setしかない時もWriteOnlyなどをつける必要はない private int _number3 = 0; public int Number3 { set { _number3 = value; } } }
「メンバーのデザインのガイドライン」の「プロパティのデザイン」にガイドラインの説明があります。これによると、設定専用プロパティ(Setしかないプロパティ)は作成せず、代わりにプロパティ名の頭に「Set」を付けた名前のメソッドを作成します。例えば上記の例では、「Number3」というプロパティの代わりに「SetNumber3」というメソッドを作成します。
その他のガイドラインについては、MSDNをご覧ください。
通常プロパティを作成する時は、上記のように、値を格納するプライベートなフィールドも用意する必要があります。しかし、C#3.0、VB10.0以降では、自動実装するプロパティを使うことで、自分でフィールドを用意する手間を省くことができます。
自動実装するプロパティを使って先ほどのNumber1プロパティを書き換えると、次のようになります。
Public Class SampleClass '自動実装するプロパティ Public Property Number1 As Integer = 0 End Class
public class SampleClass { //自動実装するプロパティ public int Number1 { get; set; } public SampleClass() { //コンストラクタで初期値を設定する Number1 = 0; } }
自動実装するプロパティでは、値を格納するプライベートフィールド(匿名バッキングフィールド)が自動的に作成されます。このフィールドは隠されており、コードからアクセスできません。
VB.NETでは、匿名バッキングフィールドの名前が、プロパティ名の頭に「_」を付けたものになります。例えば上の例では、「_Number1」となります。よって、「_Number1」という名前のメンバがこのクラスに存在してはならず、もしあったらコンパイルエラー(property 'Number1' は、同じ名前のメンバーと class 'SampleClass' で競合する '_Number1' を暗黙的に定義しています。)になります。C#ではこのような問題は起こりません。
C#では、自動実装するプロパティを読み取り専用にするために、setをプライベートにすることができます。また、C#6.0からは、getのみを宣言することもできます。
public class SampleClass { //読み取り専用の自動実装するプロパティ public int Number1 { get; private set; } //C#6.0からは、以下のようにもできる public int Number2 { get; } public SampleClass() { //コンストラクタで初期値を設定する Number1 = 0; Number2 = 0; } //C#6.0からは、次のように初期化することもできる //public int Number1 { get; private set; } = 0; //public int Number2 { get; } = 0; }
VB.NETでは、VB12から、自動実装するプロパティを読み取り専用にするために、ReadOnlyを付けることができます。
Public Class SampleClass '読み取り専用の自動実装するプロパティ Public ReadOnly Property Number1 As Integer = 0 End Class
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。