2

Microsoft には、構造体の使用に関する次の規則があります。

型のインスタンスが小さく、一般的に寿命が短い場合、または一般的に他のオブジェクトに埋め込まれている場合は、クラスではなく構造体を定義することを検討してください。

型が次の特性をすべて備えていない限り、構造体を定義しないでください。

  1. プリミティブ型 (integer、double など) と同様に、単一の値を論理的に表します。
  2. インスタンス サイズは 16 バイト未満です。
  3. 不変です。
  4. 頻繁に箱詰めする必要はありません。

私が理解している限り、値型の動作が必要な場合は構造体を作成します。もちろん、これにより、関数に割り当てて渡すときにオーバーヘッドをコピーできます。しかし、なぜ 2 と 3 に従うのでしょうか。値の型が大きすぎる場合はどうなりますか? さらに、不変型を値型にする理由がわかりません。型が不変の場合は、とにかく変更できないため、参照渡しの時間を節約することをお勧めします。

私が尋ねている理由は、オブジェクトが Vector2d タイプの Coordinates、Velocity などのプロパティを持つゲームを作成しているためです。問題は、Vector2d の不変の構造体 (大量の追加メモリが必要ではないでしょうか?)、可変の構造体 (人々は彼らが悪だと言う)、または単なるクラス (私は常に vector.Clone() を呼び出す必要があります) を作成する必要があります。同じベクトル変数を持つ 2 つのオブジェクトを意図せず取得する可能性があります)

4

4 に答える 4

2

さらに、不変型を値型にする理由がわかりません。

型は不変型であり、不変のint値型が必要な理由の完璧な例です。

int参照型であると想像してください。整数を使用するたびに逆参照する必要があるとしたら、非常にコストがかかります。これは実際、「ボックス化された」整数 (たとえば、 type の変数に格納されている整数) を使用した場合に発生することですobject。Java と比較した .NET の改善点の 1 つは、コレクションがボックス化されていない整数を保持できることです。

型が不変の場合は、参照渡しの時間を節約することをお勧めします

はい、大きくて不変の場合は、参照渡しすることで時間を節約できます。そのため、ガイドラインでは、大きな型は参照型にする必要があると提案しています。

于 2012-12-22T22:24:00.550 に答える
1

16 バイトはやや恣意的に見えますが、おそらく典型的な CPU のキャッシュ ライン サイズに関連しています。これは、最新の CPU の 64 バイトのキャッシュ ラインよりもかなり小さいです。おそらく、構造体を明示的に行に揃えることができないためです。

タイプを不変に保つことで、参照渡しの必要がなくなります。代わりに、新しいインスタンスを返すだけです。参照をたどると、キャッシュされた値を使用するよりもはるかにコストがかかります。オブジェクトを小さく保つと、キャッシュに残る可能性が高くなります。

一般的に言えば、参照セマンティクスが必要な場合はクラスにし、それ以外の場合は構造体にします。プロファイラー (またはその他の経験的証拠) を使用して、別の方法をとる正当な理由があることを証明できない限り、MS のガイドラインに従うことをお勧めします。

于 2012-12-22T22:28:28.630 に答える
0

#2 については、大きな構造体は簡単にコピーしてはならず、ほとんどの場合はクラスにする必要があります。また、これらは厳密なルールではなく、単なる経験則です。ルールに従わない正当な理由がある場合は、先に進んでください。

于 2012-12-22T22:21:11.390 に答える
-1
  1. 構造体を渡したり操作したりするときは、参照だけでなく、値全体をスタックにコピーする必要があります。特定のサイズ (16 バイト) に達したら、クラスを使用してオーバーヘッドを回避することを検討してください。

  2. 不変性は、厳密で迅速なルールではなく、コードのエラーを減らすために設計されたパターンです。値の型を不変にすることが可能な場合は、そうすると便利です。

不変性を誤解しているかもしれません。変数は値を変更できますが、値自体は変更されません。たとえば、Datetime 変数を使用して他の DateTime インスタンスに設定することはできますが、初期化後にインスタンスのフィールドを実際に変更することはできません。

于 2012-12-22T22:25:59.053 に答える