1. ホーム
  2. c#

[解決済み] C#では、なぜStringは値型のように動作する参照型なのですか?

2022-03-22 09:27:43

疑問点

Stringは、immutableであることや、同じオブジェクトを参照していることを確認するのではなく、テキストを比較するために==がオーバーロードされていることなど、値型の特徴をほとんど持っているにもかかわらず、参照型である。

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

どうすれば解決するの?

文字列は巨大になる可能性があり、ヒープに保存する必要があるため、値型ではありません。バリュータイプは(今のところCLRのすべての実装で)スタックに格納されます。スタックが32ビットで1MB、64ビットで4MBしかないため、文字列をボックス化する必要があり、コピーのペナルティが発生します。

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