変数

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

変数の基礎

 変数とは値を一時的に覚えておくためのものです。 物理的なイメージとしては、メモリ領域に確保された「箱」が変数であり、その中身が「変数の値」と言うような感じです。
 変数は宣言をしないと使えません。 宣言とは「これからこういう変数を使うから、その準備をしなさい」とコンピュータに命令をするようなものです。 宣言に際して、変数の名前と「型」を決めなければなりません。
 変数の名前は、値を入れておく箱の名前のことです。 たとえば、「年齢という数値を扱うための変数にはageという名前を付けることにする」とすれば、その変数はageという名前になります。
 その一方、型とは変数の扱える値の種類や範囲のことです。 たとえば、整数や実数、または文字などです。 この名前と型をもって変数を宣言する必要があります。

宣言方法

 変数の宣言方法はVB6からと概ね変わりありません。 宣言の構文は次の通りです。
Dim 変数の名前 As 
 次に宣言されている型はすべてVB.NETでのプリミティブ型です。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
' 整数型
Dim b As Byte ' 8ビット符号なし
Dim sh As Short ' 16ビット符号付き
Dim i As Integer  ' 32ビット符号付き
Dim l As Long ' 64ビット符号付き

' 実数型
Dim s As Single ' 単精度 (32ビット)
Dim d As Double ' 倍精度 (64ビット)
Dim dc As Decimal ' 10進型 (128ビット)

Dim c As Char ' 文字型 (16ビット符号なし整数)
Dim str As String ' 文字列型

Dim bln As Boolean ' ブール型 (16ビット)

Dim dt As Date ' 日付型 (32ビット)

Dim obj As Object ' オブジェクト型
 VB.NETから新たに加わった型は、Short, Decimal, Char, Objectです。 また、Integer型は16ビットから32ビットへと変わりました。 それに伴いLong型も32ビットから64ビットへ格上げされました。 これ以外の詳しいことはこの次を参照してください。

プリミティブ型の概要

 まずはプリミティブ型(VB.NETの基本型)の概要と扱える値の範囲をまとめておきます。
プリミティブ型の概要
名称サイズ(バイト)値の範囲
整数型
Byteバイト型10 〜 255 符号なし
Short短整数型2-32,768 〜 32,767
Integer整数型4-2,147,483,648 〜 2,147,483,647
Long長整数型8-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807
実数型
Single単精度浮動小数点型4 -3.4028235E+38 〜 -1.401298E-45 (負の値)
1.401298E-45 〜 3.4028235E+38 (正の値)
Double倍精度浮動小数点型8 -1.79769313486231570E+308 〜 -4.94065645841246544E-324 (負の値)
4.94065645841246544E-324 〜 1.79769313486231570E+308 (正の値)。
Decimal十進型16 -79,228,162,514,264,337,593,543,950,335 〜 79,228,162,514,264,337,593,543,950,335 (小数部分を持たない数値の場合)
-7.9228162514264337593543950335 〜 7.9228162514264337593543950335 (小数点以下 28 桁の数値の場合)
0.0000000000000000000000000001 (1E-28) (0 を除いた場合の絶対値の最小値)
文字・文字列型
Char文字型20 〜 65535 (符号なし)、Unicode文字一文字
String文字列型-0個 〜 約 20億個のUnicode文字
その他の型
Booleanブール型2True または False のいずれか
Date日付型80001年 1月 1日 0:00:00 AM 〜 9999年 12月 31日 11:59:59 PM
Objectオブジェクト型4任意の値

宣言と代入

 Dimステートメントを用いて一行で複数の変数を宣言する場合、カンマで区切ることで宣言することができます。 その際、次の二つのコードは同じ意味になります。
001
002
003
Dim a As Integer, b As Integer, c As Integer

Dim a, b, c As Integer
 VB6では下の宣言方法を使用すると、aとbはVariant型になりましたが、VB.NETではすべてInteger型として宣言されます。 また、異なる型の変数も一行で宣言することができます。
001
002
Dim i As Integer, s As Single, str As String
Dim b As Byte, sh As Short, l As Long
 さらに、VB.NETでは宣言と代入を同時に行えるようになっています。
001
002
003
004
005
Dim a As Integer = 2
Dim b As Integer = 7
Dim c As Integer = 15

Dim a As Integer = 2, b As Integer = 7, c As Integer = 15
 上の三行と下の一行は等価です。 それぞれaに2、bに7、cに15が代入されます。 定数以外の値、たとえば変数の値でも代入することができます。 この例ではすべての変数が2に初期化されます。
001
002
003
Dim a As Integer = 2
Dim b As Integer = a
Dim c As Integer = b
 このようにVB.NETではCやC#のような宣言方法が可能になっています。

ブロック変数

 VB.NETではブロックレベルで変数を宣言することができます。 ブロックで宣言された変数は、そのブロックでのみ有効で、ブロックの外から参照することはできません。 次のコードで宣言されている二つのyは全く独立です。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
Dim x As Integer

For x = 1 To 10

    Dim y As Integer

    y = x - 10

Next

For x = 1 To 10

    Dim y As Single

    y = CSng(x)

Next
 注意しなければならないのは、ブロック変数はプロシージャを抜けるまでその値を保持し続けることです。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
Dim x, y As Integer

For x = 1 To 2

    For y = 1 To 3

        Dim i As Integer

        i = i + 1

        Console.WriteLine(i)

    Next

Next
出力結果
1
2
3
4
5
6
 この実行結果から分かるとおり、内側のForループを抜けても変数iの値は保持されています。 毎回初期化するようにするには、次のように変数の宣言と同時に初期化する必要があります。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
Dim x, y As Integer

For x = 1 To 2

    For y = 1 To 3

        Dim i As Integer = 0

        i = i + 1

        Console.WriteLine(i)

    Next

Next
出力結果
1
1
1
1
1
1
 または宣言部をブロックの外にするという方法もあります。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
Dim x, y As Integer

For x = 1 To 2

    Dim i As Integer = 0

    For y = 1 To 3

        i = i + 1

        Console.WriteLine(i)

    Next

Next
出力結果
1
2
3
1
2
3

Const宣言・Static宣言

 定数を宣言するにはConstを用います。 定数として宣言された値は変更することができません。
001
002
003
004
005
Dim i As Integer = 7
Const ci As Integer = 2

i = 15
ci = 15 ' 定数を代入式のターゲットにすることはできません。
 Staticを用いて宣言した変数は、そのスコープから抜けても変数の値を保持し続けます。
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
Sub Main()

    ' 一度呼び出します
    StaticValue()
    LocalValue()

    ' もう一度呼び出します
    StaticValue()
    LocalValue()

End Sub

Sub StaticValue()

    Static i As Integer = 0

    i += 1

    Console.WriteLine(i)

End Sub

Sub LocalValue()

    Dim i As Integer = 0

    i += 1

    Console.WriteLine(i)

End Sub
出力結果
1
1
2
1

型の別名

 VB.NETでのプリミティブ型の表記は、すべて.NET Frameworkで定義された型の別名になっています。 次の二つのコードは全く同じものです。
VB.NETプリミティブ型
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
Dim b As Byte
Dim sh As Short
Dim i As Integer
Dim l As Long

Dim s As Single
Dim d As Double
Dim dc As Decimal

Dim c As Char
Dim str As String

Dim bln As Boolean

Dim dt As Date

Dim obj As Object
同じ型を.NET Frameworkで定義された型で宣言した場合
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
Dim b As System.Byte
Dim sh As System.Int16
Dim i As System.Int32
Dim l As System.Int64

Dim s As System.Single
Dim d As System.Double
Dim dc As System.Decimal

Dim c As System.Char
Dim str As System.String

Dim bln As System.Boolean

Dim dt As System.DateTime

Dim obj As System.Object
 表向きVB.NETに固有な型であるように見えますが、内部的には.NET Frameworkで定義されているものが使われます。 また、これらの型は実は構造体になっています。

型の最大値・最小値の取得

 すべての型には共有プロパティや共有メソッドが存在します。 整数型ではその最大値と最小値を取得することができます。
同じ型を.NET Frameworkで定義された型で宣言した場合
001
002
003
004
005
006
' 整数型の最大値、最小値
Console.WriteLine("Byte    : min {0}, max {1}", Byte.MinValue, Byte.MaxValue)
Console.WriteLine("Short   : min {0}, max {1}", Short.MinValue, Short.MaxValue)
Console.WriteLine("Integer : min {0}, max {1}", Integer.MinValue, Integer.MaxValue)
Console.WriteLine("Long    : min {0}, max {1}", Long.MinValue, Long.MaxValue)

出力結果
Byte    : min 0, max 255
Short   : min -32768, max 32767
Integer : min -2147483648, max 2147483647
Long    : min -9223372036854775808, max 9223372036854775807
 このほかにもSingle型やDate型でも様々な情報を取得できます。