Dim ステートメント (Visual Basic)

更新 : 2007 年 11 月

1 つまたは複数の変数を宣言し、記憶域を割り当てます。

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ] 
Dim [ WithEvents ] variablelist

指定項目

  • attributelist
    省略可能です。「属性リスト」を参照してください。

  • accessmodifier
    省略可能です。次のいずれかになります。

    Visual Basic でのアクセス レベル を参照してください。

  • Shared
    省略可能です。「Shared (Visual Basic)」を参照してください。

  • Shadows
    省略可能です。「Shadows」を参照してください。

  • Static
    省略可能です。「Static (Visual Basic)」を参照してください。

  • ReadOnly
    省略可能です。「ReadOnly (Visual Basic)」を参照してください。

  • WithEvents
    省略可能です。この変数が、イベントを発生させるクラスのインスタンスを参照しているオブジェクト変数であることを指定します。「WithEvents」を参照してください。

  • variablelist
    必ず指定します。このステートメントで宣言する変数のリストです。

    variable [ , variable ... ]

    variable の構文と指定項目は次のとおりです。

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With { [ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

    指定項目

    説明

    variablename

    必ず指定します。変数の名前を指定します。宣言された要素の名前 を参照してください。

    boundslist

    省略可能です。配列変数の各次元の範囲を示すリストを指定します。

    New

    省略可能です。この Dim ステートメントが実行されるときに、クラスの新しいインスタンスを作成します。

    datatype

    Option Strict が On の場合は、必ず指定します。変数のデータ型を指定します。

    With

    省略可能です。オブジェクト初期化子リストを指定します。

    propertyname

    省略可能です。インスタンスを作成しているクラスのプロパティの名前です。

    propinitializer

    propertyname = の後で必ず指定します。評価されてプロパティ名に割り当てられる式です。

    initializer

    New が指定されていない場合は省略可能です。変数の作成時に評価され、変数に割り当てられる式を指定します。

解説

プログラム内で変数を使用するときには、変数のデータ型や、その変数にアクセスできるコードなどの情報を Visual Basic コンパイラに伝えるために、個々の変数を宣言する必要があります。次の例では、Integer 値を保持する変数を宣言しています。

Dim numberOfStudents As Integer

Dim は、モジュール レベルまたはプロシージャ レベルでのみ使用できます。つまり、変数の宣言コンテキストは、クラス、構造体、モジュール、プロシージャ、またはブロックであることが必要で、ソース ファイル、名前空間、インターフェイスでは宣言できません。詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。

Option Explicit が On の場合 (既定) は、使用するすべての変数を宣言する必要があります。Option Explicit Off の場合は、開発者の意図に関係なく、宣言されていないすべての変数が既定で オブジェクト型 (Object) になります。

Dim ステートメントでは各変数のデータ型を指定できます。初期値を指定することもできます。初期値を指定しなかった場合は、既定の設定が使用されます。詳細については、このページの「詳細情報」の下にある「データ型のルール」と「既定値」を参照してください。次の例では、String 型の変数を宣言して初期化します。

Dim summary As String = "Summary of results" 

Dim ステートメントで accessmodifier を指定すると、変数にアクセスできるコードを指定できます。詳細については、「修飾子」、およびこのページの「詳細情報」の下にある「アクセス レベル」を参照してください。

複数の値を格納する配列を保持する変数も宣言できます。詳細については、このページの「詳細情報」の下にある「配列のルール」を参照してください。配列の詳細については、「Visual Basic における配列」を参照してください。次の例では、Integer 型の配列変数を宣言します。

Dim days() As Integer 

通常は、変数を使用するコード範囲の先頭に、すべての Dim ステートメントを置く必要があります。詳細については、このページの「詳細情報」の下にある「トラブルシューティング」を参照してください。

Visual Basic 2008 では、名前付きの型および匿名型のインスタンスの宣言に使用するオブジェクト初期化子、およびローカル型の推論が導入されました。詳細については、「匿名型」、「オブジェクト初期化子 : 名前付きの型と匿名型」、および「ローカル型の推論」を参照してください。

詳細情報

ここでは、次のトピックについての詳細を説明します。

  • 宣言

  • データ型

  • 配列

  • 動作

  • トラブルシューティング

宣言のルール

  • 宣言コンテキスト モジュール レベルで宣言した変数、つまりプロシージャの外部で宣言した変数のことをメンバ変数またはフィールドといいます。これは、それを宣言したクラス、構造体、モジュールのメンバです。

    プロシージャ レベルで宣言した変数はローカル変数といいます。これは、それを宣言したプロシージャまたはブロックに対してローカルになります。

  • 属性 属性はメンバ変数にのみ適用できます。ローカル変数には適用できません。属性はアセンブリのメタデータに情報を提供するものであり、ローカル変数などの一時的な記憶領域に対しては意味を持ちません。

  • 暗黙的な Dim の使用Public、Protected、Friend、Protected Friend、Private、Shared、Shadows、Static、ReadOnly、または WithEvents のいずれかの修飾子を指定する場合は、Dim キーワードを省略できます。

    Public maximumAllowed As Double
    Protected Friend currentUserName As String
    Private salary As Decimal
    Static runningTotal As Integer
    

    モジュール レベルでは、Static 修飾子を使用してメンバ変数を宣言できません。プロシージャ レベルでは、Shared、Shadows、ReadOnly、WithEvents、または任意のアクセス修飾子を使用してローカル変数を宣言できません。

  • WithEvents 変数WithEvents はメンバ変数に対してのみ指定できます。プロシージャ内のローカル変数には指定できません。

    WithEvents を指定した場合は、その変数のデータ型を Object 以外の具体的なクラス型にする必要があります。配列を WithEvents で宣言することはできません。

    イベントの詳細については、「イベントとイベント ハンドラ」を参照してください。

  • 複数の変数 1 つの宣言ステートメント内で複数の変数を宣言することができます。その場合は、それぞれの変数について variablename を指定し、配列名の後ろにはかっこを指定します。複数の変数を指定するときは、コンマ (,) で区切ります。

    Dim lastTime, nextTime, allTimes() As Date
    

データ型のルール

  • データ型Dim ステートメントでは、変数のデータ型を宣言できます。任意のデータ型、または列挙体、構造体、クラス、インターフェイスの名前を指定できます。

    Dim finished As Boolean
    Dim monitorBox As System.Windows.Forms.Form
    
  • 既定の型datatype を指定しない場合、変数は initializer のデータ型をとります。datatype と initializer のどちらも指定しない場合、データ型は既定で オブジェクト型 (Object) になります。datatype と initializer の両方を指定する場合は、initializer のデータ型を datatype と互換性のあるものにする必要があります。

  • 異なる型 宣言する変数ごとに別々の As 句を指定すると、それぞれの変数に異なるデータ型を指定できます。共通の As 句を使用すると、複数の変数を同じ型として宣言できます。それぞれの変数は、variablename の後に来る最初の As 句で指定されたデータ型をとります。

    Dim a, b, c As Single, x, y As Double, i As Integer
    ' a, b, and c are all Single; x and y are both Double
    
  • 初期化Dim ステートメントでは、特定の変数の内容を variablelist で初期化できます。値型の場合は、initializer を使用して、変数に代入する式を指定します。この式は、コンパイル時に計算可能な定数として評価されるものにしてください。

    Dim quantity As Integer = 10
    Dim message As String = "Just started"
    

    参照型の場合は、New キーワードを使用して、datatype で指定したクラスまたは構造体の新しいインスタンスを作成します。New を使用する場合は、initializer 式を使用しないでください。代わりに、必要に応じて、変数の作成元になるクラスのコンストラクタに引数を指定します。

    Dim bottomLabel As New System.Windows.Forms.Label
    

    1 つの As 句で複数の変数を宣言する場合は、その変数グループに対して initializer を指定することはできません。

配列のルール

  • 配列変数variablelist の変数が配列であることを指定するには、variablename の直後にかっこを指定します。配列に複数の次元がある場合は、次元の数を示すために、かっこの中にコンマを含める必要があります。

    Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte
    

    配列には 1 ~ 32 の次元を指定できます。

    詳細については、「Visual Basic における配列」を参照してください。

  • 配列の範囲 各次元の上限と下限を指定できます。そのためには、かっこ内に boundslist を指定します。それぞれの次元について、boundslist で上限を指定します。下限は省略可能です。下限は、指定してもしなくても常に 0 になります。各次元のインデックスは 0 から上限値までの範囲で変化します。

    次の 2 つのステートメントは等価です。どちらのステートメントも、21 個の Integer 要素から成る配列を宣言しています。この配列にアクセスするときには、インデックスは 0 ~ 20 の範囲で変化します。

    Dim totals(20) As Integer
    Dim totals(0 To 20) As Integer
    

    次のステートメントは、Double 型の 2 次元配列を宣言しています。この配列は 4 行 (3 + 1) × 6 列 (5 + 1) になります。

    Dim matrix2(3, 5) As Double
    

    上限の値は、次元のサイズを表しているのではなく、インデックスが取りうる最大の値を表していることに注意してください。次元のサイズは上限プラス 1 になります。

  • 空の配列範囲 配列宣言の範囲の指定をすべて空白にすることもできます。その場合、配列の次元数は指定した値になりますが、初期化は行われません。したがって、要素の少なくとも一部を初期化するまで、値は Nothing になります。Dim ステートメントでは、すべての次元について範囲を指定するか、指定しないかのどちらかにする必要があります。

    Dim messages() As String
    
  • 空の配列 -1 を使って配列の次元の上限を宣言できます。これは、配列が Nothing ではなく空であることを意味し、共通言語ランタイムの一部の関数では区別が必要です。ただし、Visual Basic のコードはこのような配列にアクセスできません。アクセスしようとすると、実行時に IndexOutOfRangeException エラーが発生します。詳細については、「方法 : 要素を持たない配列を作成する」を参照してください。

  • 配列の初期化 配列の値を初期化するには、初期値を中かっこ ({}) で囲んで指定します。

    Dim longArray() As Long = {0, 1, 2, 3}
    

    多次元配列の場合は、外側の次元の中に、各次元の初期値を中かっこで囲んで指定します。要素は、行優先で指定されます。

    Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
    

動作

  • 既定値 変数の initializer を指定しない場合、Visual Basic は変数をそのデータ型の既定値に初期化します。既定の初期値は、次の表のとおりです。

    データ型

    既定値

    すべての数値型 (Byte および SByte を含む)

    0

    Char

    バイナリの 0

    すべての参照型 (Object、String、およびすべての配列を含む)

    Nothing

    Boolean

    False

    Date

    西暦 1 年 1 月 1 日の午前 12:00 (01/01/0001 12:00:00 AM)

    構造体の各要素は、独立した変数として初期化されます。配列の長さを宣言しただけで要素を初期化していない場合は、各要素は独立した変数として初期化されます。

  • アクセス レベル プロシージャ外のクラス変数およびモジュール メンバ変数のアクセス レベルは、既定で private になります。構造体メンバ変数のアクセス レベルは、既定で public になります。アクセス修飾子を使用してこれらのアクセス レベルを調整できます。プロシージャ内では、ローカル変数に対してアクセス修飾子を使用できません。

  • スコープ ローカル変数のスコープは、そのプロシージャまたはブロックの内部に限られます。メンバ変数のスコープは、そのクラス、構造体、またはモジュールの全体に及びます。

  • 修飾 クラス、構造体、またはモジュールの外部のコードでメンバ変数を使用する場合は、変数名をそのクラス、構造体、またはモジュールの名前で修飾する必要があります。プロシージャまたはブロックの外部のコードから、そのプロシージャまたはブロック内のローカル変数を参照することはできません。

  • 有効期間Static ローカル変数の有効期間は、それを宣言しているプロシージャの有効期間よりも長くなります。変数の有効期間の境界は、プロシージャが宣言される場所、およびプロシージャが共有 (Shared) かどうかによって異なります。

    プロシージャの宣言

    変数が初期化されるタイミング

    変数が無効になるタイミング

    モジュール内で宣言

    プロシージャが最初に呼び出されたとき

    プログラムが実行を停止するとき

    クラスまたは構造体内で Shared として宣言

    特定のインスタンス、または宣言したクラスまたは構造体のいずれかで、プロシージャが最初に呼び出されたとき

    プログラムが実行を停止するとき

    クラスまたは構造体内で非 Shared として宣言

    特定のインスタンスで、プロシージャが最初に呼び出されたとき

    ガベージ コレクション (GC) に対して、インスタンスが解放されたとき

トラブルシューティング

  • 実行順序Dim ステートメントは、それ自身は実行可能なステートメントではありません。ただし、そこで変数を初期化する場合は、その初期化処理が代入ステートメントとして扱われます。つまり、変数の値は次の段階を経ることになります。

    1. 変数を宣言しているコード要素に初めて到達すると、Visual Basic は変数をそのデータ型の既定値に初期化します。

    2. 変数の Dim ステートメントに到達すると、Visual Basic は変数をその Dim ステートメントで指定されている値に初期化します。

    3. 再び変数の Dim ステートメントに戻ったときは、Visual Basic は変数をその Dim ステートメントで指定されている値に再度設定します。

    このことから、Dim ステートメントを使用して変数を初期化するときには次のことが言えます。

    • Dim ステートメントを実行する前に変数を使用した場合、その変数は、Dim ステートメントで指定された値ではなく、そのデータ型の既定値に設定される。

    • 実行が Dim ステートメントに到達しなかった場合、その変数が Dim ステートメントで指定された値に初期化されることはない。

    • 変数の値を変更した後で Dim ステートメントに戻った場合は、変更後の値が Dim ステートメントで指定された値に置き換えられる。

    すべての Dim ステートメントを、その変数を使用するコード範囲 (たとえばモジュールやプロシージャ) の先頭部分に記述していれば、意図したとおりにコードで変数を初期化できます。

使用例

次の例では、Dim ステートメントのさまざまなオプションを使用して変数を宣言しています。

' The following statement declares and initializes a Long variable.
Dim startingAmount As Long = 500
' The following statement declares a variable that refers to a Button 
' object, creates a new Button object, and assigns it to the variable.
Dim switchButton As New System.Windows.Forms.Button
' The following statement declares a variable that can only be 
' accessed by code in the same class, structure, or module.
Private homeTelephone As String = ""
' The following statement declares a local variable that always retains
' its value, even after its procedure returns to the calling code.
Static totalSales As Double
' The following statement declares a variable that refers to an array.
Dim highTemperature(31) As Integer
' The following statement declares and initializes an array variable 
' that holds 4 Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

参照

処理手順

方法 : 配列変数を宣言する

方法 : 配列変数を宣言する

方法 : 匿名型のインスタンスを宣言する

方法 : オブジェクト初期化子を使用してオブジェクトを宣言する

概念

Visual Basic での変数宣言

オブジェクト初期化子 : 名前付きの型と匿名型

匿名型

オブジェクト初期化子 : 名前付きの型と匿名型

ローカル型の推論

参照

Const ステートメント (Visual Basic)

ReDim ステートメント (Visual Basic)

Option Explicit ステートメント (Visual Basic)