15

Microsoftがこれらの構造体を作成することを決定した理由はありますか?

3つすべてが変更可能です。それらが不変であるか、参照型である場合、それらははるかに扱いやすいと思います。

それらが構造体でなければならない理由がある場合、なぜそれらは可変ですか?

4

2 に答える 2

20

なぜ彼らは構造体なのか

値の意味
これらの値の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これが失敗する唯一の理由は、反復を提供するためにpボックス化されているためです。objectCannot modify the result of an unboxing conversion(Rajeevに感謝します)イテレータは値ごとにデータを返し、値のコピーにのみ変更を加えます。

これは正常に機能します。

for (int i = 0; i < points.Length; i++)
{
    points[i].X += 1;
}
于 2013-01-07T08:55:18.677 に答える
2

Microsoft は、これらの構造をクラスとして定義する必要はありません。

これらは基本的に小さな構造です。

これらがclass, forPoint構造体として定義されている場合、同じ座標がメモリ内の異なるオブジェクトを参照する可能性があります。として定義するとstruct、同じ座標を持つ異なるポイント間に違いがないことがわかります。値型であることを意味します。値型は、ほとんどの場合、割り当てが安価です。それらのサイズを見てください。

Point : 8 bytes
Size: 8 bytes
Rectangle: 16 bytes

を作成するたびに新しいメモリ部分を割り当てたいと思うのは誰Point(1,2)ですか?

于 2013-01-07T09:01:12.483 に答える