2010-11-20 15 views

答えて

28

C#には統一型システムがあります。 すべてのC#タイプは、intやdoubleなどのプリミティブ型を含み、は単一のルートから継承しますobjectタイプ。クラスオブジェクトとは異なり、これらのプリミティブ型は値型です。それらは個別にヒープ割り当てされず、値渡しされます。

C#値型(プリミティブintやユーザー定義の構造体など)をパラメトリックコレクションに配置すると、ポインタを持たない密集した配列に格納されます。これは可能です。なぜなら、C#では、必要なパラメトリック 'サイズ'ごとにカスタムパラメトリックインスタンシエーションが行われるからです。つまり、C#List<int>をインスタンス化すると、基になる配列リストにはint型の密にパックされた配列が格納されます。

出典:http://www.pin5i.com/showtopic-24376.html

のJavaもは、いくつかのプリミティブ型(int型、長い、ダブル、バイトなど)をしてい - 彼らはをしている、彼らをオブジェクト指向ではないが、彼らはそれに特別なされています言語自体を使用して定義することはできませんでした。これらは値の型であり、割り当てられたヒープではなく、値によって渡されます。

出典:Comparison of C# and Java - Unified type system(ウィキペディア)

同時に、Javaはまた、しばしばboxedタイプと呼ばれるオブジェクト指向プリミティブ "ラッパー" タイプ(整数、ロング、ダブル、バイトなど)を、持っています。これらはヒープに割り当てられたオブジェクトであり、参照によって渡され、前述のプリミティブ型と並行して存在します。

Javaのより新しいバージョンでは、必要に応じてプリミティブ型が自動的にオブジェクト型に囲まれます。これにより、管理の負担が軽減されますが、微妙なバグが発生する可能性もあります(auto-boxingも参照してください)。

JavaではC#とは対照的に、組み込みのJDK Collectionsフレームワークは常にオブジェクトポインタのコレクションを管理します。後方互換性のあるパラメトリックにするために、Javaはtype-erasureという技術を実行します。実行時にすべてがコンテナ内のオブジェクトとして扱われます(コンパイル時にパラメータ化された型チェックが実行されます)。

これは、Java List<int>を作成できないことを意味します。List<Integer>しか作成できません。上記のリストは、実際にはボックス化されたIntegerオブジェクトへのポインタ配列を格納しています。これは、サイズが2倍であり、C#バージョンよりもパフォーマンスが大幅に劣ります。ほとんどのユースケースでは、このサイズとパフォーマンスの違いは無関係です。

  1. あなたが事前にあなたのリストのサイズを知っている

    は、たとえばint[]のために、ネイティブ型の配列を使用します。

    サイズと性能が関連するユースケースで

    、利用可能な2つのオプションがあります。ネイティブ型の配列はメモリに格納されているため、メモリを消費しなくなり、パフォーマンスも向上します。

  2. あなたが作成した後、それに要素を追加することが可能となる、ネイティブ配列をラップし、いくつかのサードパーティのリストの実装を使用して、事前にあなたのリストのサイズがわからない
  3. (いくつかの例:TroveColtを、FastutilGuava) 。
+0

プログラミング言語が統一型システムを使用していて、プリミティブ型とオブジェクトの両方を持つ大学プロジェクトを一度読んだが、プリミティブ型は隠された継承を持ち、基本オブジェクトとプリミティブ型はサブクラスが隠されたルートのタイプ – umlcat

+0

笑、非常によく知られている音、このプロジェクトに何が起こったのumlcat笑 – brumScouse

+0

@ brumScouse:知らない。私はリンクを失った。カスタムペットプロジェクトで、私が学んだことを適用し始めました。どちらも、JavaとC#はオブジェクトprogだけではありません。私は、オブジェクトオリエンテーションとは独立したプリミティブ型と統一型のシステムを持っていると思います。 – umlcat

12

これは実際にはC#でも当てはまりません。オブジェクトの99.9%と同じように、すべての型がオブジェクトから派生するわけではありません。オブジェクトに変換できない非常に奇妙な型が2つあります。 正式にサポートされているのはポインタのみです。 TypedReference、RuntimeArgumentHandleのような3つのサポートされていないものがあります。これらの3つの型は、C++/Cで可変長メソッドとinteropで使用されます。私はあまり心配しないだろう。

+0

この神話の詳細を探るのは神経を壊していた[ここ](https://blogs.msdn.microsoft.com/ericlippert/2009/08/06/not-everything-derives-from-object/) 3番目のサポートされていないタイプを見つけ出すには? Btwの場合でも、ポインターは 'System.IntPtr'または' System.UIntPtr'値型にキャストするまでサポートされません。 – RBT

関連する問題