COBOL では、最もよく使用されるマネージ コード型の多くについて、対応する用途が事前定義されている。これらの名前はデータ項目の宣言時に使用でき、また、型指定子をとる場所であればどこででも使用できる。詳細については、「型名の指定」を参照。次に例を示す。
01 anInteger binary-long.
事前定義されたマネージ型
マネージ COBOL |
.NET の型 |
JVM の型 |
C# のキーワード |
説明 |
整数型: |
binary-char |
System.SByte |
byte |
sbyte |
8 ビット符号付き整数 CLS 非準拠
|
binary-char unsigned |
System.Byte |
|
byte |
8 ビット符号なし整数 |
binary-short |
System.Int16 |
short |
short |
16 ビット符号付き整数 CLS 非準拠
|
binary-short unsigned |
System.UInt16 |
|
ushort |
16 ビット符号なし整数 |
binary-long |
System.Int32 |
int |
int |
32 ビット符号付き整数 |
binary-long unsigned |
System.UInt32 |
|
uint |
32 ビット符号なし整数 CLS 非準拠
|
binary-double |
System.Int64 |
long |
long |
64 ビット符号付き整数 |
binary-double unsigned |
System.UInt64 |
|
ulong |
64 ビット符号なし整数 CLS 非準拠
|
浮動小数点型: |
float-short |
System.Single |
float |
float |
単精度 (32 ビット) 浮動小数点数 |
float-long |
System.Double |
double |
double |
倍精度 (64 ビット) 浮動小数点数 |
論理型: |
condition-value |
System.Boolean |
boolean |
bool |
ブール値 (true または false) |
その他の型: |
character |
System.Char |
char |
char |
ユニコード (16 ビット) 文字 |
decimal |
System.Decimal |
「JVMDECIMAL」を参照してください。 |
decimal |
96 ビット 10 進値 |
クラス オブジェクト: |
object |
System.Object |
java.lang.Object |
object |
オブジェクト階層のルート |
string |
System.String |
java.lang.String |
string |
ユニコード文字の不変固定長文字列 |
コレクション型: |
list |
System.Collections.Generic.IList<T> |
java.util.List |
|
順序が指定された項目のコレクション。 |
dictionary |
System.Collections.Generic.IDictionary<TKey, TValue> |
java.util.Map |
|
キーと値のマッピング |
キーワード TYPE の使用による型の参照
その他のマネージ型は、COBOL ではデータ項目の定義において TYPE クラス名 構文を使用することで指定できる。次に例を示す。
01 objMyType type MyType.
上記の表の COBOL データ型と、ユーザーが定義するその他のマネージ型はすべて、対応するネイティブ型 (.NET または JVM) にマップされるが、次のルールに従う必要がある。マネージ型のルールは次のようになる。
- 01 (または 77) レベルで宣言する必要がある。
- REDEFINES または RENAMES は不要。
- 参照変更の対象であってはならない。
- ADDRESS OF 句の対象であってはならない。
- OCCURS 句のフォーマット 3 を使用して配列を宣言できる。
COBOL データ項目がこれらのルールに従わない場合や他の項類の場合、その項目はネイティブ型 (.NET または JVM) と見なされず、内部マネージ バイト配列内でコンパイラーによって割り当てられる。COBOL ポインター データ項目は、必ずこのいずれかのバイト配列を示す。
型の解決
コードにおいて、属する名前空間を指定せずに型を参照した場合、コンパイラーはまずこれを、現在のクラスの名前空間を型名に付加して構成した型に解決しようとする。次に例を示す。
$set ilusing"System"
class-id MyNamespace.EventHandler.
01 o type EventHandler.
end class.
上記の例では、01 o type EventHandler. はMyNamespace.EventHandler に解決され、System.EventHandlerには解決されない。
該当する型が存在しない場合、コンパイラーは明示されなかった型を以下のリストの順序で解決しようとする。
- 上記の名前を持ち、かつ名前空間の指定されていない型が現在のコンパイルに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
- 上記の名前を持ち、かつ名前空間の指定されていない型が参照先のアセンブリに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
- 上記の名前を持ち、かつ現在の型と同じ名前空間を持つ型が現在のコンパイルに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
- 上記の名前を持ち、かつ現在の型と同じ名前空間を持つ型が参照先のアセンブリに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
- ILUSING 指令で指定された名前空間のうちに、上記の名前を持つ型が 1つしかない場合、コンパイラーはこの型に解決する。
- ILUSING 指令で指定された名前空間のうちに、上記の型を含む名前空間が複数ある場合、コンパイラーはエラーを返す。
マネージ COBOL では、次の型を区別する。
- 値型 (binary-long や .NET の System.DateTime など)。値型のデータ項目には実際の値が含まれる。たとえば、COBOL binary-long データ項目には 32 ビット整数が含まれる。
- オブジェクト ヒープで割り当てられる参照型。参照型のデータ項目は、オブジェクト ヒープへの参照を保持する。参照型は、ガベージ コレクターの管理下にある。
すべての値型は、ボックス化と呼ばれるプロセスで参照型に変わることがある。たとえば、オブジェクト参照を、binary-long などの値型に設定できる。
ボックス化は、必要に応じて自動で行われる。たとえば、オブジェクトをパラメーターとして予測するメソッドに値タイプをパラメーターとして渡す場合など。
明示的にボックス化するには、値型を汎用型 (.NET COBOL の System.Object や JVM COBOL の java.lang.Object など) に割り当てる。
値型のボックス化を解除して、元の値型を復元できる。
データ項目の定義で TYPE classname を指定する場合:
- classname が参照型を表す場合、参照型のオブジェクトを取得する。
- classname が値型を表す場合、値型のオブジェクトを取得する。
ボックス化の際に、値がオブジェクト ヒープにコピーされ、参照がオブジェクト ヒープに戻される。参照がアクティブではなくなった場合 (オブジェクト ヒープに対して保持するものがプログラム内にないため)、オブジェクト ヒープのスペースは、ガベージ コレクターで最終的に再取得される。
[スタート > すべてのプログラム > Micro Focus Visual COBOL > サンプル > Visual COBOL サンプル] の [COBOL for .NET] にある ValueType のサンプルを参照のこと。