NETJVM 

マネージ COBOL のデータ型

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 つしか含まれていない場合、コンパイラーはこの型に解決する。
  2. 上記の名前を持ち、かつ名前空間の指定されていない型が参照先のアセンブリに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
  3. 上記の名前を持ち、かつ現在の型と同じ名前空間を持つ型が現在のコンパイルに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
  4. 上記の名前を持ち、かつ現在の型と同じ名前空間を持つ型が参照先のアセンブリに 1 つしか含まれていない場合、コンパイラーはこの型に解決する。
  5. ILUSING 指令で指定された名前空間のうちに、上記の名前を持つ型が 1つしかない場合、コンパイラーはこの型に解決する。
  6. 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 が値型を表す場合、値型のオブジェクトを取得する。

ボックス化の際に、値がオブジェクト ヒープにコピーされ、参照がオブジェクト ヒープに戻される。参照がアクティブではなくなった場合 (オブジェクト ヒープに対して保持するものがプログラム内にないため)、オブジェクト ヒープのスペースは、ガベージ コレクターで最終的に再取得される。

ValueType のサンプルを参照のこと。