C# では、なぜ文字列は値型のように動作する参照型なのでしょうか? 質問する

C# では、なぜ文字列は値型のように動作する参照型なのでしょうか? 質問する

文字列は、不変であることや、同じオブジェクトを参照しているかどうかを確認するのではなくテキストを比較するために == がオーバーロードされていることなど、値型のほとんどの特性を持っていますが、参照型です。

では、なぜ文字列は単なる値型ではないのでしょうか?

ベストアンサー1

文字列は、サイズが大きくなる可能性があり、ヒープに格納する必要があるため、値型ではありません。値型は (現時点での CLR のすべての実装では) スタックに格納されます。文字列を割り当てるスタックは、さまざまなものを壊します。スタックは 32 ビットの場合は 1 MB、64 ビットの場合は 4 MB しかありません。各文字列をボックス化する必要があり、コピー ペナルティが発生します。文字列をインターンできず、メモリ使用量が膨れ上がります。

(編集: 値型のストレージが実装の詳細であることを明確にしました。これにより、System.ValueType から継承されていない値セマティクスを持つ型が存在する状況が発生します。Ben さん、ありがとうございます。)

おすすめ記事