ここでは、VB.NET のプロパティについてサンプルを示しながら説明しています。プロパティの基本的なことを抑えておきたい人用のページです。
スポンサーリンク
プロパティの基本的な記述例
ID と Name プロパティを持つ従業員クラスを例に考えて見ます。まずはプロパティの実装例を確認してください。
Public Class Employee
Private _ID As Integer
Private _Name As String
Public Property ID() As Integer
Get
Return _ID
End Get
Set(ByVal value As Integer)
_ID = value
End Set
End Property
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
End Class
プロパティの使い方
プロパティとは、一般的にクラス内に隠蔽されたフィールドの設定および取得に用いられます。以下はプロパティの使い方のサンプルです。このような Set および Get を無条件にそのまま行えるものは基本的には Public の変数を定義しているのとあまり変わりはありません。
' インスタンス生成
Dim emp1 As New Employee()
'値の設定
emp1.ID = 1
emp1.Name = "山田太郎"
'値の取得
Console.WriteLine(emp1.ID.ToString())
Console.WriteLine(emp1.Name)
紹介したプロパティは Public で宣言されたフィールドとの違いはありません。プロパティの活用方法はどこにあるのでしょうか。
Public で宣言されたフィールド例
Public Class Employee
Public ID As Integer
Public Name As String
End Class
保守性
例えば、従業員名が 10文字より多ければ 10文字以降の文字は切り捨てて文字列を保存したい場合には、プロパティでその処理を記述すれば 1か所ですべての処理ができます。また、仮に 20文字に仕様変更となった場合でも修正は一箇所で済みます。Public 属性のフィールドの場合は、呼び出し元の全箇所に対応が必要となってしまいます。
' 10文字より長い名前は10文字に切り詰めるプロパティ
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
If (value.Length > 10) Then
_Name = value.Substring(0, 10)
Else
_Name = value
End If
End Set
End Property
アクセスレベル
設定はクラス内からのみ行い、取得はクラス外からでもできてほしい場合などプロパティのアクセス修飾子を活用できます。
Public Property ID() As Integer
Get
Return _ID
End Get
' クラス外からの設定は NG
Private Set(ByVal value As Integer)
_ID = value
End Set
End Property
プログラム作成時の設計違反を早期に発見できることになります。コンパイルエラーとります。設計者の思いをアクセス修飾子に込めることもできると言うことです。
| アクセス修飾子 | スコープ |
|---|---|
| Public | どこからでもアクセス可能 |
| Protected | 派生クラスおよび自クラスからアクセス可能 |
| Private | 自クラスからアクセス可能 |
ReadOnly / WriteOnly キーワード
自クラス内からのみ値を設定を行いたい場合は、ReadOnly キーワードを指定して Get プロパティのみを記述することもできます。
' ReadOnlyキーワードを付与すると、Getプロパティのみ記述できる。
Public ReadOnly Property ID() As Integer
Get
Return _ID
End Get
End Property
ReadOnly キーワードがあるということは WriteOnly キーワードもあります。この場合は Set プロパティのみ記述できます。
' WriteOnlyキーワードを付与すると、Setプロパティのみ記述できる。
Public WriteOnly Property ID() As Integer
Set(ByVal value As Integer)
_ID = value
End Set
End Property
VB2010 自動実装プロパティ
VB2010から自動実装プロパティが用意されました。その記述方法は以下の通りです。
Public Class Employee
' 自動実装プロパティ(初期値も設定可能)
Private Property ID As Integer = -1
Public Property Name As String = ""
End Class
ただし、Set / Get が同一のアクセス修飾子で定義されますので、Set / Get を異なるアクセス修飾子にすることはできません。また、設定 ( Set ) 前に処理を行いたいときには、自動実装プロパティを Public または Protected で宣言し、派生クラスでプロパティをオーバーライド ( Overrides ) する必要があります。もちろん基底クラスのプロパティはオーバーライダブル ( Overridable ) で宣言されている必要があります。
自動実装プロパティと ReadOnly、WriteOnly キーワードの併用もできません。VB2010 では構文エラーとなってしまいます。今後に期待です。
' WriteOnlyキーワードと自動実装プロパティの併用はできない
Private WriteOnly Property ID As Integer = -1
' ReadOnlyキーワードと自動実装プロパティの併用はできない
Public ReadOnly Property Name As String = ""
Pingback: [ C# 入門編 ] 自動実装プロパティとアクセスレベル – 勉強ダイエット