COBOL では、最もよく使用される .NET 型の多くについて、対応する用途が事前定義されている。これらの名前はデータ項目の宣言時に使用でき、また、型指定子をとる場所であればどこででも使用できる。詳細については、「型名の指定」を参照。次に例を示す。
01 anInteger binary-long.
事前定義された .NET 型
.NET または JVM 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 |
Unicode (16 ビット) 文字 |
decimal |
System.Decimal |
「JVMDECIMAL」を参照してください。 |
decimal |
96 ビット 10 進値 |
クラス オブジェクト: |
object |
System.Object |
java.lang.Object |
object |
オブジェクト階層のルート |
string |
System.String |
java.lang.String |
string |
Unicode 文字の不変固定長文字列 |
コレクション型: |
list |
System.Collections.Generic.IList<T> |
java.util.List |
|
順序が指定された項目のコレクション |
dictionary |
System.Collections.Generic.IDictionary<TKey, TValue> |
java.util.Map |
|
キーと値のマッピング |
set |
System.Collections.Generic.ISet<T> |
java.util.Set<T> |
|
順序が指定されていない項目のコレクション |
キーワード TYPE の使用による型の参照
その他のマネージ型は、COBOL ではデータ項目の定義において TYPE classname 構文を使用することで指定できる。次に例を示す。
01 objMyType type MyType.
上記の表の COBOL データ型と、ユーザーが定義するその他の .NET 型はすべて、対応するネイティブ型 (.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. は System.EventHandler ではなく MyNamespace.EventHandler に解決される。
該当する型が存在しない場合、コンパイラは明示されなかった型を以下のリストの順序で解決しようとする。
- 上記の名前を持ち、かつネームスペースの指定されていない型が現在のコンパイルに 1 つしか含まれていない場合、コンパイラはこの型に解決する。
- 上記の名前を持ち、かつネームスペースの指定されていない型が参照先のアセンブリに 1 つしか含まれていない場合、コンパイラはこの型に解決する。
- 上記の名前を持ち、かつ現在の型と同じネームスペースを持つ型が現在のコンパイルに 1 つしか含まれていない場合、コンパイラはこの型に解決する。
- 上記の名前を持ち、かつ現在の型と同じネームスペースを持つ型が参照先のアセンブリに 1 つしか含まれていない場合、コンパイラはこの型に解決する。
- ILUSING 指令で指定されたネームスペースのうちに、上記の名前を持つ型が 1つしかない場合、コンパイラはこの型に解決する。
- ILUSING 指令で指定されたネームスペースのうちに、上記の型を含むネームスペースが複数ある場合、コンパイラはエラーを返す。
.NET 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 が値型を表す場合、値型のオブジェクトを取得します。
ボックス化の際に、値がオブジェクト ヒープにコピーされ、参照がオブジェクト ヒープに戻されます。参照がアクティブではなくなった場合 (オブジェクト ヒープに対して保持するものがプログラム内にないため)、オブジェクト ヒープのスペースは、ガベージ コレクターで最終的に再取得されます。
次の場所にある ValueType のサンプルを参照してください。 Start > All Programs > Micro Focus Visual COBOL > Samples、COBOL for .NET の場合。