変数
注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。
変数の基礎
変数とは値を一時的に覚えておくためのものです。 物理的なイメージとしては、メモリ領域に確保された「箱」が変数であり、その中身が「変数の値」と言うような感じです。
変数は宣言をしないと使えません。 宣言とは「これからこういう変数を使うから、その準備をしなさい」とコンピュータに命令をするようなものです。 宣言に際して、変数の名前と「型」を決めなければなりません。
変数の名前は、値を入れておく箱の名前のことです。 たとえば、「年齢という数値を扱うための変数にはageという名前を付けることにする」とすれば、その変数はageという名前になります。
その一方、型とは変数の扱える値の種類や範囲のことです。 たとえば、整数や実数、または文字などです。 この名前と型をもって変数を宣言する必要があります。
宣言方法
変数の宣言方法はVB6からと概ね変わりありません。 宣言の構文は次の通りです。
次に宣言されている型はすべて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 | バイト型 | 1 | 0 〜 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 | 文字型 | 2 | 0 〜 65535 (符号なし)、Unicode文字一文字 |
| String | 文字列型 | - | 0個 〜 約 20億個のUnicode文字 |
| その他の型 |
| Boolean | ブール型 | 2 | True または False のいずれか |
| Date | 日付型 | 8 | 0001年 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型でも様々な情報を取得できます。