Microsoftがこれらの構造体を作成することを決定した理由はありますか?
3つすべてが変更可能です。それらが不変であるか、参照型である場合、それらははるかに扱いやすいと思います。
それらが構造体でなければならない理由がある場合、なぜそれらは可変ですか?
Microsoftがこれらの構造体を作成することを決定した理由はありますか?
3つすべてが変更可能です。それらが不変であるか、参照型である場合、それらははるかに扱いやすいと思います。
それらが構造体でなければならない理由がある場合、なぜそれらは可変ですか?
値の意味
これらの値の2つの同一のインスタンス間に本質的な違いはありません。座標Point
を[2,3]
持つものは、同じ座標を持つ他の点と同じint
です。同じような値を持つ2つの点が等しいのと同じです。これは、設計ガイドラインに準拠しています。
プリミティブ型(integer、doubleなど)と同様に、単一の値を論理的に表します。
パフォーマンス
値型は、割り当てと割り当て解除の方が安価です。
多くの場合、これらの値の多くのインスタンスを作成する必要があります。構造体の作成コストは低く、ローカル値の場合はスタック上に作成され、GCからの圧力を軽減します。
サイズ
これらの値のサイズを考えてみましょう
Point
::8バイト
Size
:8バイト
Rectangle
:16バイト
Point
およびの場合Size
、それらのサイズは、64ビットシステムでのクラスインスタンスへの参照と同じです。
Microsoftのガイドラインから引用:クラスと構造の選択
これらの構造体は完全に変更可能です。これは、変更操作のために新しい値を作成する必要がないため、パフォーマンスのために(ガイドラインに反して)行われます。
コメントのOPのコード例について:
Point[] points = new Point[] { new Point(0,0), new Point(1,1), new Point(2,2) };
foreach (Point p in points)
{
p.X += 1;
}
foreach
これが失敗する唯一の理由は、反復を提供するために(Rajeevに感謝します)イテレータは値ごとにデータを返し、値のコピーにのみ変更を加えます。p
がボックス化されているためです。object
Cannot modify the result of an unboxing conversion
これは正常に機能します。
for (int i = 0; i < points.Length; i++)
{
points[i].X += 1;
}
これらは基本的に小さな構造です。
Rectangle Structure
4 つの整数のセットを格納します。Point Structure
整数の x 座標と y 座標の順序付けられたペアを表します。Size Structure
順序付けられた整数のペアを格納します。これらがclass
, forPoint
構造体として定義されている場合、同じ座標がメモリ内の異なるオブジェクトを参照する可能性があります。として定義するとstruct
、同じ座標を持つ異なるポイント間に違いがないことがわかります。値型であることを意味します。値型は、ほとんどの場合、割り当てが安価です。それらのサイズを見てください。
Point : 8 bytes
Size: 8 bytes
Rectangle: 16 bytes
を作成するたびに新しいメモリ部分を割り当てたいと思うのは誰Point(1,2)
ですか?