4
構造体とクラスがC#で概念を分けているのはなぜですか?
C#でプログラミングしているときに、理解できない奇妙な言語設計の決定につまずきました。 したがって、C#(およびCLR)には2つの集約データ型があります:(struct値型、スタックに格納され、継承なし)およびclass(参照型、ヒープに格納され、継承あり)。 この設定は最初はいい感じに聞こえますが、その後、集計タイプのパラメーターを取るメソッドに出くわし、実際に値タイプか参照タイプかを判断するには、そのタイプの宣言を見つける必要があります。時には非常に混乱することがあります。 一般的に受け入れられている問題の解決策は、すべてstructのを「不変」(フィールドをに設定readonly)として宣言して、起こりうる間違いを防ぎ、structsの有用性を制限しているようです。 たとえば、C ++ははるかに使いやすいモデルを採用しています。スタックまたはヒープのいずれかにオブジェクトインスタンスを作成し、値または参照(またはポインター)で渡すことができます。私はC#がC ++に触発されたと聞き続けていますが、なぜこの1つの手法を採用しなかったのか理解できません。組み合わせるclassとstruct経由で参照として(明示的に)二つの異なる割り当てオプション(ヒープとスタック)と一方の構築物へと値として周りにそれらを渡したりrefしてout、キーワードはいいことのように思えます。 質問は、なぜやったclassし、structC#とCLRで別々の概念の代わりに、2つのアロケーションオプションを持つ1つの集約タイプになりますか?