「Vol.1 VB.NETについて」の中でVB6.0とVB.NETとのデータ型の違いについて示した。ここでは再度、VB.NETがサポートするデータ型について説明する。従って、すでに理解している部分については読み飛ばして欲しい。
概要
VB.NETにおけるデータ型について次表に示す。
データ型 | 共通言語ランタイムの型 | サイズ(B) | 値の範囲 |
Boolean | System.Boolean | 2 | TrueまたはFalse |
Byte | System.Byte | 1 | 0 ~ 255(符号なし) |
Char | System.Char | 2 | 0 ~ 65535(符号なし) |
Date | System.DateTime | 8 | 0001年1月1日 0:00:00~9999年12月31日 11:59:59 PM |
Decimal | System.Decimal | 16 | (小数部分を持たない数値の場合) -79,228,162,514,264,337,593,543,950,335~ 79,228,162,514,264,337,593,543,950,335 (小数点以下28桁の数値の場合) 7.9228162514264337593543950335 (0を除いた場合の絶対値の最小値) 0.0000000000000000000000000001(1E-28) |
Double | System.Double | 8 | (負の値) (正の値) 4.94065645841246544E-324~ 1.79769313486231570E+308 |
Integer | System.Int32 | 4 | |
Long | System.Int64 | 8 | |
Object | System.Object | 4 | 任意の型を格納可能。 |
Short | System.Int16 | 2 | |
Single | System.Single | 4 | (負の値) (正の値) 1.401298E-45~ 3.4028235E+38 |
String | System.String | 可変長 | 0~約20億のUnicode文字 |
構造体 | System.ValueTypeから継承 | 可変長 | 定義メンバの型に依存する |
値型
値型はスタック領域に格納され、常にその型の値を含んでいる(要するに実体をもち、直接アクセスする)。また、値型のインスタンスが含まれている場所が破棄されると値型のインスタンスも破棄される。値型には文字列型を除くプリミティブ型、列挙型、および構造体が含まれる。値型変数への代入は実際のデータがコピーされる
注)プリミティブ型とは通常の型(System 名前空間で定義されている型)のエイリアスで、Byte、Short、Integer、Long、Single、Double、Decimal、Boolean、Date、Char、Stringを指す。
Boolean(ブール型)
ブール型の変数は2バイトの数値として格納されるが、格納可能な値は「True」または 「False」のみとなる。数値データ型をブール型に変換した場合、「0」は 「False」となり、「0」以外の値は「True」となる。またブール型の値を数値型に変換した場合、「False」は 「0」となり「True」は「-1」となる。プログラム言語(例えばVB.NETやC++)によりブール型の値が異なる場合があるため、ブール型変数を条件式で判定する場合は、リテラル文字で判定を行わず、必ずキーワード(True/False)で判定を行うように心掛ける方が良い。
isEmpty = True
Byte(バイト型)
バイト型の変数は符号なしの8ビット数値として格納され、バイナリデータを格納するためのデータ型として使用する。ASCII文字を格納する場合は数値変換関数を使用して代入する。
Dim asciiCode As Byte
counter = 128
asciiCode = Microsoft.VisualBasic.Asc(“A”)
Char(文字型)
文字型の変数は符号なしの16ビット数値として格納され、各数値は1つのUnicode文字を表す。文字型変数にUnicode文字を代入する場合はリテラル型文字「c」を付加する。また、文字型と数値型の間でデータ変換する場合はAscW関数およびChrW関数を使用する。
uniCode = “A”c
Date(日付型)
日付型の変数はIEEE 64ビットの整数として格納され、西暦1年1月1日から西暦9999年12月31日までの日付と0:00:00から23:59:59までの時刻を表す。
Dim dateToDay As Date = Today()
Decimal(10進型)
10進型の変数は128ビットの符号付き整数(内部は12バイトの整数値に2つの2バイトの値を組み合わせたハイブリッド型)として格納され、10の累乗の指数によって小数点の右側の桁数が指定される(小数点部桁数は0~28の範囲の値)。小数点部桁数が0の場合の絶対値の最大値は、79,228,162,514,264,337,593,543,950,335となり、小数点以下28桁における絶対値の最大値は7.9228162514264337593543950335となる。
リテラルにリテラル型文字「D」を付加すると10進型リテラルを示し、識別子に識別子型文字「@」を付加すると10進型に変換される。
sampVal = 1234567890D
Single(単精度浮動小数点型)
単精度浮動小数点数型の変数はIEEE 32ビットの符号付き浮動小数点数として格納され、負は-3.4028235E+38~-1.401298E-45の値となり、正は1.401298E-45~3.4028235E+38の値となる。
リテラルにリテラル型文字「F」を付加すると単精度浮動小数点数型を示し、識別子に識別子型文字「!」を付加すると単精度浮動小数点数型に変換される。
sampVal = 123.456F
Double(倍精度浮動小数点型)
倍精度浮動小数点数型の変数はIEEE 64ビットの符号付き浮動小数点数として格納される。負は-1.79769313486231570E+308~-4.94065645841246544E-324の値となり、正は4.94065645841246544E-324~1.79769313486231570E+308の値となる。
リテラルにリテラル型文字「R」を付加すると倍精度浮動小数点型を示し、識別子に識別子型文字「#」を付加すると倍精度浮動小数点型に変換される。
sampVal = 123.456R
Integer(整数型)
整数型の変数は32ビットの符号付き整数として格納され、-2,147,483,648~2,147,483,647の値となる。
リテラルにリテラル型文字「I」を付加すると整数型を示し、識別子に識別子型文字「%」を付加すると整数型に変換される。
sampVal = 1234567890
Long(長整数型)
長整数型の変数は64ビットの符号付き整数として格納され、-9,223,372,036,854,775,808~9,223,372,036,854,775,807の値となる。
リテラルにリテラル型文字「L」を付加すると長整数型を示し、識別子に識別子型文字「&」を付加すると長整数型に変換される。
sampVal = 1234567890L
Short(短整数型)
短整数型の変数は16ビットの符号付き整数として格納され、-32,768~32,767の値となる。
リテラルにリテラル型文字「S」を付加すると短整数型を示す。
sampVal = 123S
構造体(ユーザ定義型)
ユーザ定義型の変数は1つ以上のメンバ変数を連結したもので、メンバとなる変数の型は任意となる。
構造体の宣言は「Structure」ステートメントと「End Structure」ステートメントの間で行い、「Structure」ステートメントにて構造体名を指定する。メンバとなる変数は「Dim」ステートメントまたは「Public」「Private」「Friend」などのアクセス子を使用して宣言する。「Dim」ステートメントを使用した場合のアクセス子はデフォルトで「Public」となる。
Private a, b As Long
Private s As String
Public x, y As Integer
Public Sub New(x As Integer, y As Integer)
Me.x = x
Me.y = y
End Sub
End Structure
上のように宣言した場合、以下のコードは「1」を出力する。
Sample a = new Sample(1, 2)
Sample b = a
a.x = 3
Console.WriteLine(b.x)
※上記の例でSample型が構造体でなくクラスである場合は「3」を出力する。
参照型
参照型はランタイムヒープに格納され、その記憶域への参照を通してだけアクセスできる(要するに実体のアドレスを管理し、間接的にアクセスする)。
参照型変数にはその型の実体の参照、またはnull参照が設定されており、null参照の場合は代入以外の操作は無効となる。また、参照型変数への代入は、参照している実体がコピーされるのではなく参照だけがコピーされる。参照型にはクラス、文字列、標準モジュール、インターフェイス、配列、およびデリゲートが含まれる。
String(文字列型)
文字列型の変数は16ビットの符号なし数値(実際はUnicode文字)の連続として格納され、約20億個までのUnicode文字を扱うことができる。識別子に識別子型文字「$」を付加すると文字列型に変換される。
errMessage = “ただいま準備中です。”
文字列は変更不可能なデータであり修正ができない。文字列型が実装しているメソッドにも修正を行うものが多々あるが、これらは文字列を修正しているのではなく新たな文字列を作成している。文字列型の変数に文字列を代入した場合、元の参照が解放され新たな参照が設定される。
オブジェクト型
オブジェクト型は値型でも参照型でもない(両方の型の親となる)が、実際には参照型として実装される。
Object(オブジェクト型)
オブジェクト型の変数にはオブジェクトの実体を参照する32ビットのアドレスが格納され、任意の参照型(文字列、配列、クラス、およびインターフェイス)を割り当てられる。また、任意の値型データとしても参照できる。
※オブジェクト型については別の章で再度説明したい