Class_Initialize の変更点 (Visual Basic 6.0 ユーザー向け)

更新 : 2007 年 11 月

コンストラクタは、オブジェクトを作成するときに実行するメソッドです。コンストラクタは、これまで Visual Basic に導入されていませんでした。コンストラクタは、New ステートメントと Visual Basic 6.0 の Class_Initialize メソッドの動作を併せ持ちますが、クラス インスタンスを作成するための柔軟性と制御の機能をさらに高いレベルで備えています。オブジェクトの作成の詳細については、「オブジェクトの作成と使用」を参照してください。

Class_Initialize

Visual Basic 6.0

Visual Basic 6.0 では、コンストラクタの概念は Class_Initialize メソッドをとおしてサポートされます。このメソッドはプライベートであり、パラメータは指定できません。このメソッドは、クラスの新しいインスタンスを作成するときに自動的に呼び出されます。New キーワードを呼び出すと、Class_Initialize メソッドが呼び出されます (このメソッドが存在しない場合は呼び出されません)。

たとえば、既定を 5 年間として、樹木の年間成長率を指定するとします。クラス コードは次のようになります。

' Visual Basic 6.0
Private mvarYearlyGrowth As Integer

Public Property Get YearlyGrowth() As Integer
    YearlyGrowth = mvarYearlyGrowth
End Property

Public Property Let YearlyGrowth(ByVal newValue As Integer)
    mvarYearlyGrowth = newValue
End Property

Private Sub Class_Initialize()
    mvarHeight = 5
End Sub

樹木を作成し、プロパティを設定するコードは、次のようになります。

Dim growingTree As New Tree
growingTree.YearlyGrowth = 10

Visual Basic 2008

Visual Basic 2008 では、コンストラクタは New キーワードを通してサポートされます。この場合、YearlyGrowth プロパティを設定するコードは不要です。New キーワードを呼び出すと、クラスのオーバーロードされた New メソッドの 1 つが呼び出されます。クラスに New メソッドが存在しない場合は、このメソッドがパラメータなしでコンパイラによって作成されます。

Option Strict On
Public Class Tree
  Private yearlyGrowthValue As Integer = 5

  Public Property YearlyGrowth() As Integer
      Get
          Return yearlyGrowthValue
      End Get
      Set(ByVal Value As Integer)
          yearlyGrowthValue = Value
      End Set
  End Property


  Public Sub New(ByVal newYearlyGrowth As Integer)
      Me.YearlyGrowth = newYearlyGrowth
  End Sub
End Class

樹木を作成し、プロパティを設定するコードは、次のようになります。

Dim growingTree As New Tree(10)

この例では、年間成長率を指定しないで Tree を作成することはできません。これをできるようにするには、パラメータのない別の New メソッドをクラスに追加します。これは、コンストラクタを "オーバーロードする" と呼ばれます。

New キーワード

Visual Basic 6.0

Visual Basic 6.0 では、次のようなコード行は一般に推奨されません。

Dim growingTree As New Tree

その理由は、growingTree 変数にアクセスするたびに、コンパイラでは値が Nothing かどうかがチェックされるからです。この値であれば、新しいインスタンスが作成され、growingTree に割り当てられます。これは効率が悪いだけでなく、プログラミング エラーにもつながります。

Visual Basic 2008

Visual Basic 2008 では、インスタンスはチェックされず、新しいインスタンスは作成されません。新しいインスタンスを作成する唯一の方法は、New または As New キーワードを使ってコード行を実行することです。事実上、このようなコード行は、新しいインスタンスの作成を扱う際に現在推奨される唯一の方法です。

アップグレードのヒント

アップグレード ウィザードは、Class_Initialize メソッドを次のコードにアップグレードします。

'UPGRADE_NOTE: Class_Initialize was upgraded to Class_Initialize_Renamed. Click for more: ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1061"'

Private mvarHeight As Short
Private Sub Class_Initialize_Renamed()
    mvarHeight = 0
End Sub

Public Sub New()
    MyBase.New()
    Class_Initialize_Renamed()
End Sub

Class_Initialize_Renamed の呼び出しを削除し、このコードをコンストラクタに直接移動してもかまいません。不要なプロシージャ呼び出しが省かれるので、コードが読みやすくなります。ほとんどの New 呼び出しの後で特定のプロパティを設定している場合は、それらのプロパティを設定するコンストラクタを追加することをお勧めします。Visual Basic 6.0 コードは、Visual Basic 2008 では次のコードで置き換えることができます。

Public Sub New(ByVal newYearlyGrowth As Integer)
    Me.YearlyGrowth = newYearlyGrowth
End Sub

参照

処理手順

方法 : New キーワードを使用する

その他の技術情報

オブジェクトの作成と使用