[ VB.NET ] プロパティのアクセスレベルと自動実装プロパティ

Pocket

ここでは、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 = ""
スポンサーリンク


Pocket

One thought on “[ VB.NET ] プロパティのアクセスレベルと自動実装プロパティ”

  1. Pingback: [ C# 入門編 ] 自動実装プロパティとアクセスレベル – 勉強ダイエット

Leave a Comment

Your email address will not be published. Required fields are marked *