類推すると、C#は基本的にメカニックのツールのセットのようなもので、一般にペンチや調節可能なレンチは避けるべきだと誰かが読んでいるので、調節可能なレンチはまったく含まれず、プライヤーは「安全でない」とマークされた特別な引き出しにロックされています、使用者の健康に対する責任を免責する免責事項に署名した後、監督者の承認を得てのみ使用できます。
比較すると、C ++には調整可能なレンチとプライヤーだけでなく、目的がすぐには分からない奇妙な特殊用途のツールも含まれており、それらを保持する正しい方法がわからない場合、 thumb(ただし、使用方法を理解したら、C#ツールボックスの基本ツールでは本質的に不可能なことを実行できます)。さらに、旋盤、フライス盤、平面研削盤、金属切削バンドソーなどがあり、必要に応じていつでもまったく新しいツールを設計および作成できます(ただし、これらの機械工のツールは、あなたが彼らと何をしているのかわからない場合、あるいはあなたがただ不注意になったとしても、重傷)。
これは、哲学の基本的な違いを反映しています。C++は、基本的に必要な設計に必要なすべてのツールを提供しようとします。これらのツールの使用方法を制御しようとすることはほとんどないため、まれな状況でのみ機能するデザインを作成するためにそれらを使用することも簡単です。彼らはまったくうまくいく可能性があります。特に、この決定の大部分は、設計上の決定を分離することで行われます。実際にほとんど常に結合されているものであってもです。その結果、C ++を記述することとC ++を適切に記述することには大きな違いがあります。C ++を上手に書くには、多くのイディオムと経験則(他の経験則を破る前にどれだけ真剣に再検討するかについての経験則を含む)を知る必要があります。結果として、C ++は、学習の容易さよりも(専門家による)使いやすさを重視しています。また、あまりにも簡単に使用できない状況もあります(多すぎる)。
C#は、言語設計者が優れた設計手法と見なしたものを強制する(または少なくとも非常に強く示唆する)ために、さらに多くのことを行います。C ++で分離されている(ただし、実際には通常一緒に行われる)かなりの数のことは、C#で直接結合されます。「安全でない」コードが境界を少し押し上げることを許可しますが、正直なところ、全体ではありません。
その結果、一方では、C#で表現するのにかなり不格好な、C ++でかなり直接表現できるデザインがかなりあります。一方、それはです全体 C#を学ぶために非常に簡単に、そしてその状況に作業(またはおそらく他)しません、本当に恐ろしい設計を生産する可能性がされて大幅に減少しました。多くの場合(おそらくほとんどの場合)、いわば「流れに乗る」だけで、堅実で実行可能な設計を得ることができます。または、私の友人の1人(少なくとも私は彼を友人だと思うのが好きです-彼が本当に同意するかどうかはわかりません)がそれを好むので、C#は成功の落とし穴に陥りやすくします。
したがって、2つの言語でどのようにどのようclass
にstruct
取得されるかという問題をより具体的に見ると、基本クラス/インターフェイスを装って派生クラスのオブジェクトを使用する可能性のある継承階層で作成されたオブジェクトは、通常、何らかのポインタまたは参照を介して行う必要があるという事実に固執しています-具体的なレベルでは、派生クラスのオブジェクトには、基本クラス/のインスタンスとして扱うことができる何かのメモリが含まれていますインターフェイス、および派生オブジェクトは、メモリのその部分のアドレスを介して操作されます。
C ++では、それを正しく行うのはプログラマー次第です。継承を使用している場合、(たとえば)階層内のポリモーフィッククラスで機能する関数がポインターまたはベースへの参照を介して確実に機能するようにするのは彼次第ですクラス。
C#では、基本的に型間の同じ分離はより明確であり、言語自体によって強制されます。プログラマーは、クラスのインスタンスを参照渡しするための手順を実行する必要はありません。これはデフォルトで行われるためです。
struct
sは常にスタックに格納されるとは限りません。struct
フィールドを持つオブジェクトを検討してください。それはさておき、メイソン・ウィーラーがスライスの問題に言及したように、おそらく最大の理由です。