2

C#プリミティブ型を含むすべての型が型から継承する統一型システムを持っています object


Javaまた、すべてのクラスがobject型から継承されています。

からの引用Thinking in java

単一ルートの階層により、ガベージコレクターの実装がはるかに簡単になります


ガベージコレクションを行うのに役立ちますか?もしそうなら、unified type systemどのようsingle rooted hierarchy

4

4 に答える 4

1

Finalize主な理由は、すべてのオブジェクトにメソッドがあることを保証するのに役立ち、GC との自動互換性を可能にすることだと思います。

このメソッドは、GC.SuppressFinalize の呼び出しによってオブジェクトがファイナライズから除外されていない限り、オブジェクトにアクセスできなくなった後に自動的に呼び出されます。アプリケーション ドメインのシャットダウン中に、まだアクセス可能なオブジェクトであっても、ファイナライズを免除されていないオブジェクトに対して Finalize が自動的に呼び出されます。オブジェクトが GC.ReRegisterForFinalize などのメカニズムを使用して再登録され、その後 GC.SuppressFinalize が呼び出されていない場合を除き、Finalize は特定のインスタンスで 1 回だけ自動的に呼び出されます。

于 2013-01-01T11:31:00.270 に答える
1

さて、ここに問題があります。ガベージ コレクターが改善されるため、問題が解決すると想定します。

IT は、ガベージ コレクションを回避 (!) できるため、役立ちます。

構造体 C# では、int などのすべてのプリミティブ型だけでなく、自分で作成したものもすべて、ボックス化されていない限り (オブジェクトに割り当てられ、ラッパーを取得します)、ガベージ コレクションされません。

これは、ポイント (x と y を int として) のような要素をガベージ コレクターでゼロ オーバーヘッドにすることができることを意味します。

基本的に、Java プリミティブは「コンパイラ ハック」であり、C# プリミティブは「オブジェクト階層の反対側」であり、クラスではなく構造体です。

したがって、統合型 System は、統合によってガベージ コレクタを支援するのではなく、そもそもガベージ コレクションされるオブジェクトを作成しないことによって支援します。

これは、一般的なサポートにより、すべてのアイテムをボックス化する必要のない効率的なコレクションにもつながります。ランタイムにはバイトコードレベルでのジェネリックの概念がないため、そこにあるものはすべて「オブジェクト」ですが、C#ではリストはバイトコードの別のタイプのリストであり、最適化されているため、Javaでは問題が発生します。

于 2013-01-01T11:32:19.183 に答える
1

ガベージ コレクターが必要とする唯一のことは、オブジェクトのサイズと、オブジェクト内の参照がどこにあるか (たとえば型から) を識別できることです。

これを判断する方法が 1 つあれば、はるかに簡単になります。

于 2013-01-01T11:35:01.487 に答える