CLR は値型と参照型の 2 つの型をサポートしています FCL の型のほとんどは参照型のようですが、最も一般的に使用される型は値型です。参照型は常にマネージド ヒープから割り当てられ、new 演算子を使用してオブジェクトがインスタンス化されると、返されたオブジェクト メモリ アドレスは変数に格納されます。参照型を使用するときに理解すべき心理的要因は次の 4 つです:
1. メモリはマネージド ヒープから割り当てられる必要があります
2. ヒープ上に割り当てられた各オブジェクトには、使用前に初期化する必要がある追加のメンバーがいくつかあります。
3. オブジェクト内の他のバイトは常にゼロに設定されます。
4. マネージドヒープからオブジェクトを割り当てる際、ガベージコレクションが強制される場合があります。
参照型を悪用すると、必然的にオーバーロードが発生することがわかります。値の型をもう一度見てみると、これは通常、スレッド スタック上に割り当てられ、それを運ぶ変数にはインスタンスへのポインタが含まれていません。ガベージ コレクターによって制御されないため、型を使用すると、マネージド ヒープへの負荷が軽減され、アプリケーションの存続期間中のガベージ コレクションの数が減ります。
C#で「クラス」と呼ばれるものは参照型であり、値型は構造体または列挙型です。すべての構造は、抽象型 System.ValueType から直接派生します。そして、それ自体は Object から直接派生し、すべての列挙型は System.Enum 抽象型から派生し、Enum は ValueType から派生し、それらはすべて相互にリンクされています。
独自の型を設計するとき、いつそれを値型として定義しますか?
1. この型はプリミティブ型(コンパイラによって直接サポートされるデータ型(Int32、Int64など))の動作をします
2. この型は他の型を継承する必要がありません。
3. この型は他の型を派生させません。
4. 値型は実パラメータや戻り値として使用する際に対応するフィールドをコピーする必要があるため、インスタンスが大きすぎると一定のパフォーマンス低下が発生します。
そのため、型インスタンスは小さく(16バイト以内)、インスタンスは大きくする必要がありますが、メソッドの実引数として渡してメソッドから返す必要はありません。
値型と参照型の違いについては、いくつかの点があります:
1. 参照型はボックス化された形式であり、値型は非ボックス化された形式です。この 2 つは、特定の方法で相互に変換することもできます。 (具体的な手順については次回のブログで詳しくお話します)
2. 値型は新しい仮想メソッドを導入しないでください。すべてのメソッドは抽象化できず、上書きを防ぐために暗黙的にシールされます。
3. 値型変数を別の値型変数に代入すると、フィールドごとのコピーが実行されます。参照型の変数を別の参照型に代入すると、メモリ アドレスのみがコピーされます。 2 つ以上の参照型変数がヒープ上の同じオブジェクトを参照することができ、1 つの変数に対して実行される操作が別の変数によって参照されるオブジェクトに影響を与える可能性があります。対照的に、値型変数は独立しており、互いに影響しません。
4. ボックス化されていない値型はヒープ上に割り当てられないため、この型のインスタンスがアクティブでなくなると、それらに割り当てられたストレージは解放され、ガベージ コレクションを待たなくなります
以上がC# の値型と参照型の違いを比較するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。