1 つ以上の変数の記憶域を宣言して割り当てます。
構文
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist
部品
attributelist任意。 「属性リスト」を参照してください。
accessmodifier任意。 次のいずれかを指定できます。
「 Access levels in Visual Basic」を参照してください。
Shared任意。 「Shared」を参照してください。
Shadows任意。 「Shadows」を参照してください。
Static任意。 「 静的」を参照してください。
ReadOnly任意。 ReadOnly を参照してください。
WithEvents任意。 これらは、イベントを発生させる可能性のあるクラスのインスタンスを参照するオブジェクト変数であることを指定します。 WithEvents を参照してください。
variablelist必須。 このステートメントで宣言されている変数の一覧。
variable [ , variable ... ]variableの構文と指定項目は次のとおりです。variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]部分 説明 variablename必須。 変数名。 「宣言された要素名」を参照してください。 boundslist任意。 配列変数の各次元の境界のリスト。 New任意。 Dimステートメントの実行時に、クラスの新しいインスタンスを作成します。datatype任意。 変数のデータ型。 With任意。 オブジェクト初期化子リストを紹介します。 propertyname任意。 インスタンスを作成するクラス内のプロパティの名前。 propinitializer=を propertynameした後に必要です。 評価され、プロパティ名に割り当てられる式。initializerNewが指定されていない場合は省略可能です。 変数の作成時に評価され、変数に割り当てられる式。
注釈
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
プロシージャ、ブロック、クラス、構造体、またはモジュールで変数を宣言できます。 ソース ファイル、名前空間、またはインターフェイスで変数を宣言することはできません。 詳細については、「 宣言コンテキストと既定のアクセス レベル」を参照してください。
モジュール レベルで宣言されている変数は、プロシージャの外部でメンバー 変数 または フィールドです。 メンバー変数は、クラス、構造体、またはモジュール全体のスコープ内にあります。 プロシージャ レベルで宣言される変数は ローカル変数です。 ローカル変数は、プロシージャまたはブロック内でのみスコープ内にあります。
プロシージャの外部で変数を宣言するには、 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 ステートメント」を参照してください。
初期値の指定
変数の作成時に値を割り当てることができます。 値型の場合は、 初期化子 を使用して、変数に割り当てる式を指定します。 式は、コンパイル時に計算できる定数に評価される必要があります。
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 ステートメント 」および 「ローカル型の推論」を参照してください。
データ型または初期化子が指定されていない場合の動作については、このトピックで後述する 「既定のデータ型と値 」を参照してください。
オブジェクト初期化子を使用して、名前付き型と匿名型のインスタンスを宣言できます。 次のコードでは、 Student クラスのインスタンスを作成し、オブジェクト初期化子を使用してプロパティを初期化します。
Dim student1 As New Student With {.First = "Michael",
.Last = "Tucker"}
オブジェクト初期化子の詳細については、「 方法: オブジェクト初期化子を使用してオブジェクトを宣言する」、 オブジェクト初期化子: 名前付き型と匿名型、および 匿名型を参照してください。
複数の変数の宣言
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 にかっこで囲んですぐに従います。 配列の詳細については、「配列」を参照してください。
配列の各次元の下限と上限を指定できます。 これを行うには、かっこ内に boundslist を含めます。 ディメンションごとに、 boundslist は上限と、必要に応じて下限を指定します。 下限は、指定したかどうかにかかわらず常に 0 です。 各インデックスは、0 から上限の値まで異なる場合があります。
次の 2 つのステートメントは同等です。 各ステートメントは、21 個の Integer 要素の配列を宣言します。 配列にアクセスすると、インデックスは 0 から 20 まで異なる場合があります。
Dim totals(20) As Integer
Dim totals(0 To 20) As Integer
次のステートメントは、 Double型の 2 次元配列を宣言します。 配列には、それぞれ 6 列 (5 + 1) の 4 行 (3 + 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 つを -1 に宣言することで、 長さ 0 の配列を宣言できます。 長さ 0 の配列を保持する変数には、 Nothing値がありません。 特定の共通言語ランタイム関数では、長さ 0 の配列が必要です。 このような配列にアクセスしようとすると、ランタイム例外が発生します。 詳細については、「配列」を参照してください。
配列リテラルを使用して、配列の値を初期化できます。 これを行うには、初期化値を中かっこ ({}) で囲みます。
Dim longArray() As Long = {0, 1, 2, 3}
多次元配列の場合、各独立した次元の初期化は外側の次元の中かっこで囲まれます。 要素は行優先順に指定されます。
Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}
配列リテラルの詳細については、「 配列」を参照してください。
既定のデータ型と値
次の表では、 Dim ステートメントでデータ型と初期化子を指定するさまざまな組み合わせの結果について説明します。
| データ型が指定されましたか? | 初期化子が指定されましたか? | 例 | 結果 |
|---|---|---|---|
| いいえ | いいえ | Dim qty |
Option Strict がオフ (既定値) の場合、変数は Nothing に設定されます。Option Strictがオンの場合、コンパイル時エラーが発生します。 |
| いいえ | イエス | Dim qty = 5 |
Option Infer がオン (既定値) の場合、変数は初期化子のデータ型を受け取ります。
「ローカル型の推論」を参照してください。Option Inferがオフで、Option Strictがオフの場合、変数はObjectのデータ型を受け取ります。Option Inferがオフで、Option Strictがオンの場合は、コンパイル時エラーが発生します。 |
| イエス | いいえ | Dim qty As Integer |
変数は、データ型の既定値に初期化されます。 このセクションの後半の表を参照してください。 |
| イエス | イエス | Dim qty As Integer = 5 |
初期化子のデータ型が指定したデータ型に変換できない場合は、コンパイル時エラーが発生します。 |
データ型を指定しても初期化子を指定しない場合、Visual Basic は変数をそのデータ型の既定値に初期化します。 次の表に、既定の初期化値を示します。
| データの種類 | 既定値 |
|---|---|
すべての数値型 ( Byte と SByteを含む) |
0 |
Char |
Binary 0 |
すべての参照型 ( Object、 String、すべての配列を含む) |
Nothing |
Boolean |
False |
Date |
1 年 1 月 1 日の午前 12:00 (01/01/0001 12:00:00 AM) |
構造体の各要素は、別の変数であるかのように初期化されます。 配列の長さを宣言しても、その要素を初期化しない場合、各要素は別の変数であるかのように初期化されます。
静的ローカル変数の有効期間
Staticローカル変数の有効期間は、宣言されているプロシージャの有効期間よりも長くなります。 変数の有効期間の境界は、プロシージャが宣言される場所と、プロシージャが Sharedかどうかによって異なります。
| プロシージャ宣言 | 初期化された変数 | 変数は既存のものを停止します |
|---|---|---|
| モジュール内 | プロシージャを初めて呼び出す場合 | プログラムが実行を停止したとき |
クラスまたは構造体では、プロシージャは Shared |
プロシージャが特定のインスタンスで、またはクラスまたは構造体自体で初めて呼び出される場合 | プログラムが実行を停止したとき |
クラスまたは構造体では、プロシージャは Shared |
特定のインスタンスで初めてプロシージャを呼び出す場合 | インスタンスがガベージ コレクション (GC) 用に解放されたとき |
属性と修飾子
属性は、ローカル変数ではなくメンバー変数にのみ適用できます。 属性はアセンブリのメタデータに情報を提供します。これは、ローカル変数などの一時ストレージでは意味がありません。
モジュール レベルでは、 Static 修飾子を使用してメンバー変数を宣言することはできません。 プロシージャ レベルでは、 Shared、 Shadows、 ReadOnly、 WithEvents、またはアクセス修飾子を使用してローカル変数を宣言することはできません。
accessmodifierを指定することで、変数にアクセスできるコードを指定できます。 クラスおよびモジュール メンバー変数 (プロシージャの外部) は既定でプライベート アクセスに、構造体メンバー変数は既定でパブリック アクセスになります。 アクセス修飾子を使用してこれらのアクセス レベルを調整できます。 ローカル変数 (プロシージャ内) でアクセス修飾子を使用することはできません。
WithEventsは、プロシージャ内のローカル変数ではなく、メンバー変数でのみ指定できます。
WithEventsを指定する場合、変数のデータ型は、Objectではなく、特定のクラス型である必要があります。
WithEventsを使用して配列を宣言することはできません。 イベントの詳細については、「 イベント」を参照してください。
注
クラス、構造体、またはモジュールの外部のコードでは、メンバー変数の名前を、そのクラス、構造体、またはモジュールの名前で修飾する必要があります。 プロシージャまたはブロックの外側のコードは、そのプロシージャまたはブロック内のローカル変数を参照できません。
マネージド リソースの解放
.NET Framework ガベージ コレクターは、追加のコーディングを行わずにマネージド リソースを破棄します。 ただし、ガベージ コレクターを待機するのではなく、マネージド リソースを強制的に破棄することができます。
クラスが特に貴重で希少なリソース (データベース接続やファイル ハンドルなど) を保持している場合は、次のガベージ コレクションが使用されなくなったクラス インスタンスをクリーンアップするまで待つ必要がない場合があります。 クラスは、ガベージ コレクションの前にリソースを解放する方法を提供するために、 IDisposable インターフェイスを実装できます。 そのインターフェイスを実装するクラスは、貴重なリソースをすぐに解放するために呼び出すことができる Dispose メソッドを公開します。
Using ステートメントは、リソースの取得、一連のステートメントの実行、リソースの破棄のプロセスを自動化します。 ただし、リソースは IDisposable インターフェイスを実装する必要があります。 詳細については、ステートメントの使用に関する情報を参照してください。
例 1
次の例では、さまざまなオプションで Dim ステートメントを使用して変数を宣言します。
' Declare and initialize a Long variable.
Dim startingAmount As Long = 500
' 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}
例 2
次の例では、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
例 3
次の例では、 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
こちらも参照ください
.NET