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

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

必須。 変数の名前を指定します。 「宣言された要素の名前 (Visual Basic)」を参照してください。

boundslist

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

New

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

datatype

省略可能。 変数のデータ型を指定します。

With

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

propertyname

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

propinitializer

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

initializer

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

解説

Visual Basic コンパイラは、Dim ステートメントを使用して、変数のデータ型と、変数にアクセスできるコードなどの他の情報を確認します。 次の例では、Integer 値を保持する変数を宣言しています。

Dim numberOfStudents As Integer

任意のデータ型か、列挙体、構造体、クラス、またはインターフェイスの名前を指定できます。

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

参照型の場合は、New キーワードを使用して、データ型によって指定したクラスまたは構造体の新しいインスタンスを作成します。 New を使用する場合、初期化子式は使用しません。 代わりに、必要に応じて、変数の作成元になるクラスのコンストラクターに引数を指定します。

Dim bottomLabel As New System.Windows.Forms.Label

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

モジュール レベルで宣言された変数 (プロシージャの外部で宣言された変数) をメンバー変数またはフィールドと呼びます。 メンバー変数のスコープは、そのクラス、構造体、またはモジュールの全体に及びます。 プロシージャ レベルで宣言された変数をローカル変数と呼びます。 ローカル変数のスコープは、そのプロシージャまたはブロックの内部に限られます。

プロシージャの外部で変数を宣言するには、Public、Protected、Friend、Protected Friend、および Private の各アクセス修飾子を使用します。 詳細については、「Visual Basic でのアクセス レベル」を参照してください。

Dim キーワードは省略可能です。Public、Protected、Friend、Protected Friend、Private、Shared、Shadows、Static、ReadOnly、または WithEvents のいずれかの修飾子を指定した場合、通常はこのキーワードを省略します。

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

Option Explicit が (既定値) オンの場合、コンパイラは、使用するすべての変数を宣言する必要があります。 詳細については、「Option Explicit ステートメント (Visual Basic)」を参照してください。

初期値の指定

変数の作成時に、変数に値を代入できます。 値型の場合は、初期化子を使用して変数に代入する式を指定します。 この式は、コンパイル時に計算可能な定数として評価されるものにしてください。

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

初期化子を指定し、As 句でデータ型を指定していない場合、型の推論を使用して初期化子からデータ型が推論されます。 次の例では、num1 と num2 は両方とも整数として厳密に型指定されています。 2 番目の宣言では、型の推論によって値 3 から型が推論されます。

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

型の推論は、プロシージャ レベルで適用されます。 型の推論は、クラス、構造体、モジュール、またはインターフェイスのプロシージャの外部には適用されません。 型の推論については、「Option Infer ステートメント」および「ローカル型の推論 (Visual Basic)」を参照してください。

データ型または初期化子を指定しない場合に実行される処理については、このトピックで後述する「既定のデータ型と値」を参照してください。

オブジェクト初期化子を使用して、名前付きの型および匿名型のインスタンスを宣言できます。 次のコードでは、Student クラスのインスタンスを作成し、オブジェクト初期化子を使用してプロパティを初期化します。

Dim student1 As New Student With {.First = "Michael", 
                                  .Last = "Tucker"}

オブジェクト初期化子の詳細については、「方法: オブジェクト初期化子を使用してオブジェクトを宣言する (Visual Basic)」、「オブジェクト初期化子: 名前付きの型と匿名型 (Visual Basic)」、および「匿名型 (Visual Basic)」を参照してください。

複数の変数の宣言

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

Dim lastTime, nextTime, allTimes() As Date

1 つの 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

配列

複数の値を格納する配列を保持する変数も宣言できます。 変数で配列を保持するように指定するには、variablename の直後にかっこを指定します。 配列の詳細については、「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) になります。 上限値は、次元のサイズではなく、インデックスの最大有効値を表していることに注意してください。 次元のサイズは、上限に 1 を加えた値になります。

Dim matrix2(3, 5) As Double

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

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

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

配列に複数の次元がある場合は、次元の数を示すために、かっこの中にコンマを含める必要があります。

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

配列の次元のいずれかを -1 として宣言することで、長さ 0 の配列を宣言できます。 長さ 0 の配列を保持する変数の値は、Nothing ではありません。 長さ 0 の配列は、共通言語ランタイムの一部の関数で必要となります。 このような配列にアクセスしようとすると、ランタイム例外が発生します。 詳細については、「Visual Basic における配列」を参照してください。

配列リテラルを使用して、配列の値を初期化できます。 そのためには、初期値を中かっこ ({}) で囲んで指定します。

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

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

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

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

既定のデータ型と値

次の表に、Dim ステートメントで、データ型と初期化子をさまざまに組み合わせて指定した場合の結果を示します。

データ型が指定されている

初期化子が指定されている

結果

いいえ

いいえ

Dim qty

[Option Strict] が (既定値) オフの場合、変数は Nothingに設定されます。

Option Strict が On の場合、コンパイル時のエラーが発生します。

いいえ

はい

Dim qty = 5

[Option Infer] が (既定値) オンの場合、変数が初期化子のデータ型になります。 「ローカル型の推論 (Visual Basic)」を参照してください。

Option Infer が Off で、Option Strict が Off の場合、変数は Object のデータ型になります。

Option Infer が Off で、Option Strict が On の場合、コンパイル時のエラーが発生します。

はい

いいえ

Dim qty As Integer

変数は、データ型の既定値に初期化されます。 このセクションの下記の表を参照してください。

はい

はい

Dim qty As Integer = 5

初期化子のデータ型が、指定されたデータ型に変換できない場合、コンパイル時のエラーが発生します。

データ型を指定し、初期化子を指定していない場合、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)

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

Static ローカル変数の有効期間

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

プロシージャの宣言

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

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

モジュール内で宣言

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

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

クラスや構造体では、プロシージャは Shared。

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

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

クラスや構造体では、プロシージャは Sharedではありません。

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

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

属性と修飾子

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

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

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

WithEvents はメンバー変数に対してのみ指定できます。プロシージャ内のローカル変数には指定できません。 WithEvents を指定した場合は、変数のデータ型として Object 以外のクラス型を指定する必要があります。 配列を WithEvents で宣言することはできません。 イベントの詳細については、「イベント (Visual Basic)」を参照してください。

注意

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

マネージ リソースの解放

.NET Frameworkのガベージ コレクターは、追加のコーディングを使用せずに、マネージ リソースを破棄します。 ただし、ガベージ コレクターを待たずに、マネージ リソースの破棄を強制できます。

特に有用で、リソース不足 (データベース接続またはファイル ハンドルなど) に、クラスの保持がまで使用しなくなったクラスのインスタンスをクリーンするには、次のガベージ コレクション待ちしない場合があります。 クラスは、ガベージ コレクションの前にリソースを解放する手段を提供するために IDisposable のインターフェイスを実装することがあります。 インターフェイスは貴重なリソースを直ちに解放する呼び出すことができる Dispose のメソッドを公開すること実装するクラス。

Using のステートメントがリソースを取得する、一連のステートメントを実行すると、リソースを破棄するプロセスを自動化します。 ただし、リソースは IDisposable のインターフェイスを実装する必要があります。 詳細については、「Using ステートメント (Visual Basic)」を参照してください。

使用例

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

' Declare and initialize a Long variable. 
Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object, 
' create a Button object, and assign the Button object 
' to the variable. 
Dim switchButton As New System.Windows.Forms.Button

' Declare a local variable that always retains its value, 
' even after its procedure returns to the calling code. 
Static totalSales As Double 

' Declare a variable that refers to an array. 
Dim highTemperature(31) As Integer 

' Declare and initialize an array variable that 
' holds four Boolean check values. 
Dim checkValues() As Boolean = {False, False, True, False}

次の例では、1 ~ 30 の素数の一覧を表示します。 ローカル変数のスコープは、コードのコメントに記述されています。

Public Sub ListPrimes()
    ' The sb variable can be accessed only 
    ' within the ListPrimes procedure. 
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only 
    ' within the For...Next block.  A different 
    ' variable with the same name could be declared 
    ' outside of the For...Next block. 
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If 
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29 
End Sub 


Private Function CheckIfPrime(ByVal number As Integer) As Boolean 
    If number < 2 Then 
        Return False 
    Else 
        ' The root and highCheck variables can be accessed 
        ' only within the Else block.  Different variables 
        ' with the same names could be declared outside of 
        ' the Else block. 
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within 
        ' the For...Next block. 
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then 
                Return False 
            End If 
        Next 

        Return True 
    End If 
End Function

次の例では、speedValue 変数をクラス レベルで宣言しています。 変数の宣言に、Private キーワードを使用しています。 この変数には、Car クラスのプロシージャによってアクセスできます。

' Create a new instance of a Car. 
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by 
    ' any procedure in the Car class. 
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer 
        Get 
            Return speedValue
        End Get 
    End Property 

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub 
End Class

参照

処理手順

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

関連項目

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

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

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

Option Infer ステートメント

Option Strict ステートメント

[コンパイル] ページ (プロジェクト デザイナー) (Visual Basic)

概念

Visual Basic での変数宣言

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

匿名型 (Visual Basic)

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

ローカル型の推論 (Visual Basic)

その他の技術情報

Visual Basic における配列