OSTRACISM CO.

C#とObjective-CとJavaと...

配列

 GraphicGripGropのサムネールデータは単純にshortの配列である。

C#

public short[] m_thumbnail = null;
...
m_thumbnail = new short[m_thumbnailCount];
...
m_thumbnail[y * width + x] = (short)((r << 8) + (g << 4) + (b));
 shortの配列型のオブジェクトを生成している。これがC++なら実際に単純なshortの配列なのだが、C#の配列はSystem.Arrayのエイリアスなので、実際にはメモリ上にリニアに配置されているとは期待できない。配列数はLengthプロパティで参照する。
 最後の行は
m_thumbnail.SetValue((short)((r << 8) + (g << 4) + (b)), y * width + x);
と同等。

Objective-C

short *m_thumbnail;
...
m_thumbnail = malloc(m_thumbnailCount * sizeof(short));
...
m_thumbnail[y * width + x] = (short)((r << 8) + (g << 4) + (b));
 Objective-Cならではの機能はなく、Cでの配列の扱いのままであり、m_thumbnailはリニアにshortの配列と期待できる。当然だが最もオーバーヘッドも機能も少ない。配列数を配列自身から得ることはできない。

Java

public short[] m_thumbnail = null;
...
m_thumbnail = new short[m_thumbnailCount];
...
m_thumbnail[y * width + x] = (short)((r << 8) + (g << 4) + (b));
 shortの配列を生成しているが、実際にどのようにメモリ配置されているかはわからない。Javaの配列も一応オブジェクトなのである。とはいえCの配列に比べ配列数を配列自身から得られる程度しか追加機能はない。配列数はlengthメンバで参照する、これはメソッドではなくメンバ変数。
 最後の行は
Array.setShort(m_thumbnail, y * width + x, (short)((r << 8) + (g << 4) + (b)));
とも書けるが、配列はメソッド等を持たないのでjava.lang.reflect.Arrayクラスを使ってアクセスする。

可変長の配列

 検索でヒットしたファイルの情報を保管するのに配列を使っているが、この場合は可変長の配列ということで言語の機能の配列ではない。OOP言語のクラスライブラリには配列を高機能化したクラスが用意されているのが一般的だ。

C#

ArrayList m_hits = new ArrayList();
...
m_hits.Add(info);
...
TFileInfo info = (TFileInfo)m_hits[n];
 System.Collections.ArrayListを使う。最後の行が特徴的な表現で、System.Collections.ArrayListはSystem.Arrayと同じくSystem.Collections.IListインターフェースの実装で、「[]」を使ったアクセスが可能になっている。

Objective-C

m_hits = [[NSMutableArray alloc] init];
...
[m_hits addObject: info];
...
TFileInfo *info = [m_hits objectAtIndex:n];
 NSArrayは固定長の配列で、可変長はNSMutableArrayを使う。コレクションのクラス。

Java

ArrayList m_hits = new ArrayList();
...
m_hits.add(info);
...
TFileInfo info = (TFileInfo)m_hits.get(n);
 java.util.ArrayListを使う。コレクションのクラス。

2005.07.06
「インデックス」へ戻る

OSTRACISM CO.
OSTRA / Takeshi Yoneki