C#仕様のセクションの解釈が必要


11

私はC#仕様を読んでいます。セグメントで説明を使用できます:

C#には統一型システムがあります。intやdoubleなどのプリミティブ型を含むすべてのC#型は、単一のルートオブジェクト型を継承します。したがって、すべてのタイプは一連の共通操作を共有し、任意のタイプの値を一貫した方法で格納、転送、および操作できます。さらに、C#はユーザー定義の参照型と値型の両方をサポートしているため、オブジェクトの動的な割り当てと軽量構造のインラインストレージが可能です。

この文脈で「軽量構造のインラインストレージ」とはどういう意味ですか?

回答:


11

Svickの答えは良いが、私はいくつかの余分なポイントを追加すると思った。

まず、段落に欠陥があります。ポインタ型はオブジェクトから継承しません。コンパイル時にインターフェイス型または型パラメーター型として知られている値は、実行時に、無効な参照またはオブジェクトから継承する何かの真正なインスタンスのいずれかになりますが、これらの型は「オブジェクトから継承します。継承は、祖先のメンバーが子孫のメンバーであるプロパティですが、通常、「ToString」がIEnumerableのメンバーであるとは考えません。IEnumerableを実装するもののメンバーであると考えています

これは仕様に「プリミティブ型」が表示される唯一の場所であり、定義なしに表示されるため、段落にも欠陥があります。したがって、これは不必要でわかりにくいため、削除する必要があります。

この段落をしばらくの間修正したいと思っていました。次回Madsを見るとき、彼に思い出させます。

特定の質問に対処するには:svickはもちろん正しいですが、特定の例を見ると役立ちます。あなたが言う時:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

そして、あなたは、例えば、配列を作成します:

ColorfulInt[] x = new ColorFulInt[100];

次に、これらの100個のintと100個のColorのストレージは、配列自体に格納されます。代わりに、ColorfulIntがクラスである場合、配列には、ColorfulIntへの100個の参照が含まれ、各参照を個別に割り当てる必要があります。これらの100個の要素を個別に割り当てることは、単に配列自体にストレージを割り当てるよりも、時間とスペースの両方で効率がはるかに低くなります。


だから、それらのオブジェクトのメモリ抽象化の重要性は、オブジェクトを操作する準備ができているときに、アドレス可能なスペースの1つの連続したブロックにある場合にアクセスしやすく、どこを知っているかを指すポインタですか?それは正しいですか、それともまだ何かが欠けていますか?
チャックT

@ChuckT:正しい。インダイレクションのオーバーヘッドを支払う必要はなく、キャッシュの局所性も優れています。
エリックリッパー

12

つまり、値型は定義した場所に直接格納されるため、参照型と比較した場合に効率が向上します。

それはどういう意味ですか?値型のローカル変数がある場合、通常はスタックに直接格納されます(ただし、多くの例外があります)。値型のフィールドがある場合は、それを囲むクラスまたは構造に直接保存されます。


1
それは理にかなっている。それを肉付けしてくれてありがとう、svick!
ChuckT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.