DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

クラスのプロパティを宣言する

ここでは、Visual Basic 6.0と比較して、VB.NET(及び、C#)のプロパティについて説明します。

Visual Basic 6.0 では、Property Get、Property Let、Property Setの各ステートメントを使用してプロパティの値を取得および設定ができました。また、ByRefプロパティ引数の使用も可能でした。これに対してVB.NETではプロパティ宣言の構文が大きく異なります。例えば、ByRefプロパティ引数の使用は出来なくなりました。下の例を参考にしてください。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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プロパティを書き換えると、次のようになります。

VB.NET
コードを隠すコードを選択
Public Class SampleClass
    '自動実装するプロパティ
    Public Property Number1 As Integer = 0
End Class
C#
コードを隠すコードを選択
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のみを宣言することもできます。

C#
コードを隠すコードを選択
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を付けることができます。

VB.NET
コードを隠すコードを選択
Public Class SampleClass
    '読み取り専用の自動実装するプロパティ
    Public ReadOnly Property Number1 As Integer = 0
End Class
  • 履歴:
  • 2011/5/15 Option Strict が On でもエラーが出ないようにVB.NETのコードを修正。
  • 2011/12/16 「ガイドラインについて」と「自動実装するプロパティ」を追加。
  • 2016/9/4 C#6.0とVB12からサポートされた自動実装するプロパティの新機能に関する説明を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。