型
ActiveBasicは、全てのオブジェクトが型を持ち、変数なども型を持ちますが、静的型付けを採用しています。なお、型を暗黙の内に侵犯可能なため安全でない型付けに留まっています。
型の種類
- 基本型
- コンパイラが直接的に理解できる型のことを言います。詳細は基本型一覧をご覧ください。
- クラス
- Classステートメントで定義される型です。
- 構造体
- Typeステートメントで定義される型です。
- 列挙体
- Enumステートメントで定義される型です。
- インタフェース
- Interfaceステートメントで定義される型です。
- デリゲート
- Delegateステートメントで定義される型です。
値型と参照型
ABでは、基本型及び構造体は値型として扱います。値型はローカル領域またはグローバル領域に配置され、インスタンスの生存期間はスコープレベルで決まります。
クラス型・インタフェース型・列挙型・デリゲート型は参照型です。これらの実体はヒープ領域に確保されます。インスタンスの生存期間はガベージコレクタが管理します。
型の利用
変数
変数の型は、Dimステートメントで指定します。
Dim m As Long
初期化子がある場合、初期化子の式の型から変数の型が決定可能です(型推論)。
Dim x = 2.5 '2.5はDouble型なので、xはDouble型になる。
なお、次のような場合は、初期化子がAs型変換演算子を含んだ式であると解釈されます。
Dim y = x As Single
関数
関数にAddressOf関数を使用すると、その関数に適合する関数へのポインタ型の値が得られます。
Sub f1() : End Sub Dim pfn = AddressOf (f1) 'f1は*Sub()
引数・戻り値
基本的に変数と同じです。
Function sq(x As Long) As Long sq = x * x End Sub
上の例では、引数xとsqの戻り値がそれぞれLong型と宣言されています。
クラス・構造体・共用体
列挙体
基本型一覧
基本型とはコンパイラが直接的に認識できるデータの種類です。基本型は値を保持するためだけにある型ですので、オブジェクトとしての振る舞いはありません。
整数型
符号有型 | 範囲 | 大きさ | 符号無型 | 範囲 |
SByte | -128 〜 127 | 1バイト | Byte | 0 〜 256 |
Integer | -32,768 〜 32,767 | 2バイト | Word | 0 〜 65,536 |
Long | -2,147,483,648 〜 2,147,483,647 | 2バイト | DWord | 0 〜 4,294,967,295 |
Int64 | -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 | 2バイト | QWord | 0 〜 18446744073709551615 |
なお、Long/DWordは、Win32及びWin64においてC/C++などのint/unsgiend intに相当する最も自然な大きさの整数型です。特段事情が無ければ普段はLongとDWordを主に使います。
浮動小数点型
x86/x64の仕様により、IEEE 754の単精度・倍精度の形式に対応しています。
Single
- 概要
- 単精度浮動小数点型
- サイズ
- 4 byte
- 値の範囲
- 3.4E +/- 38 (7 桁)
Double
- 概要
- 倍精度浮動小数点型
- サイズ
- 8 byte
- 値の範囲
- 1.7E +/- 308 (15 桁)
ブーリアン
Boolean
- 概要
- 真偽値を見分けるための型
- サイズ
- 1 byte
- 値の種類
- True or False
- ※内部表現は True = 1、False = 0 となります。比較演算の戻り値はBoolean型です。
ポインタ型
ABでは、他のBasic言語ではあまり見ることのないポインタ型の扱いに対応しています。メモリ内部を詳細に指定できるポインタ機能、ハードに近いレベルでの利用が可能ですが、使い方によってはバグを引き起こす原因にもなります。必要なときは細心の注意を払って利用していくのが望ましいでしょう。Win32 APIを直接的に利用する場合などに利用を留めておきましょう。
- 概要
- オブジェクトを指し示す型、実態はアドレス値を保持する整数型となっている
- サイズ
- 4 byte (in Win32) or 8 byte (in Win64)
VoidPtr
どのようなオブジェクトを指し示すこともできるポインタ型です。
その他オブジェクトへのポインタ型
型名に*を前置すると、その型を指し示すポインタ型を意味します。例: *Byte, *String
関数へのポインタ型
関数宣言に*を前置すると、その関数を指し示すポインタ型を意味します。例: *Sub(x As Double), *Function(ptr As VoidPtr)
As DWord。詳しくは関数#関数ポインタを参照してください。
Object
Objectは、全てのクラスの基底クラスです。そのため、全てのクラスのインスタンスはObjectへの型変換が可能です。
Class Aima End Class Dim a = New Aima Dim o = a As Object
なお、Objectの実態はSystem.Objectとしてライブラリ内に存在します。メンバなどはObjectクラスを参照してください。
String
Stringは、文字列型です。実態はSystem.Stringとしてライブラリ内に存在します。メンバなどはStringクラスを参照してください。
ライブラリで定義される型
これらの型は全てインクルードファイルの中でTypeDefによって定義されています。
整数型
LONG_PTR
Win32 (x86)の環境ではLong型として認識されます。Win64 (x86-64)の環境ではInt64型として認識されます。ULONG_PTRと共に、ポインタ値を保持できる整数型として使用されます。
ULONG_PTR
Win32 (x86)の環境ではDWord型として認識されます。Win64 (x86-64)の環境ではQWord型として認識されます。
SIZE_T
SIZE_Tはメモリの大きさを表す符号無し整数型で、現在ULONG_PTRからTypeDefされています。
SSIZE_T
SIZE_Tの符号有り版で、現在LONG_PTRからTypeDefされています。
ポインタ型
次の型が互換性のためそれぞれ定義されています。
BytePtr
*ByteからのTypeDef
WordPtr
*WordからのTypeDef
DWordPtr
*DWordからのTypeDef
SinglePtr
*SingleからのTypeDef
DoublePtr
*DoubleからのTypeDef
文字型
Char
- 概要
- 1文字を表現するための型です。
- サイズ
- 1 byte(マルチバイト環境)
- 2 byte(Unicode環境)
現在CharはTypeDefで定義されています。
WCHAR
WCHARは常にUnicode (UCS-2/UTF-16LE)文字を保持する2バイトの型です。