3

XNA の BoundingSpheres に問題があります。BoundingSphere のリストに BoundingSphere を追加したいと考えています。現時点では、次の行に沿っています。

Aircraft(Vector3 pos, float radius, CollisionManager colMan)
{ 
    BoundingSphere sphere = new BoundingSphere(pos, radius);
    colMan.AddSphere(sphere)
}


List<BoundingSphere> spheres = new List<BoundingSphere>();

CollisionManager()
{
    spheres = new List<BoundingSphere>();
}

AddSphere(BoundingSphere boundingSphere)
{
    spheres.Add(boundingSphere);
}

参照が追加されるのではなく、値が追加されているようです。これは、boundingSpheres が構造体だからだと思いますか? どうすればこれを回避できますか?ref キーワードを試しましたが、リスト内の値がまだ更新されていません。

4

3 に答える 3

2

率直に言うと、少なくとも直接的にはできません。構造体は値型であるため、値によって渡されて格納されます。値型への参照を返すことができないrefため、キーワードを賢明に使用しても回避できません。List<T>.Item

回避策は、 を にstruct変換するか、 を の中にclass埋め込むか、値型であるという事実を処理して適切に処理することです (つまり、ローカル コピーを変更しようとせずに、変更の際は記載)。最後のオプションは、いも、最高です。stuctclass

于 2012-12-03T20:03:00.777 に答える
0

値の型は値によって渡されます (これは、メソッドまたはコンテナーで新しいコピーを取得していることを意味します) これを回避するには、構造体をクラスに変更し、構造体宣言にインターフェイスを追加し、参照を格納する構造体をボックス化します。代わりにインターフェイス。

しかし、可変構造体を使用しているようで、非常に危険な動作に直面する可能性があるため、これは非常に危険です (詳細については、有害と見なされる可変構造体を参照してください)。

于 2012-12-03T19:57:23.553 に答える
0

の定義をclassBoundingSphereからstructに変更する必要があります。これは、コントロール外のアセンブリで定義されているため不可能です。

構造をボックス化することはできません。箱を開けるたびに、保持している構造のコピーを取得することになります。

そうは言っても、これを行う唯一の方法は (私の意見では、これは良い考えではありません)、構造体のクラス ラッパーを作成し、プロパティから構造体へのすべての呼び出しを内部的に委譲することです。

public class BoundingSphereWrapper
{
     // Set through constructor.
     private readonly BoundingSphere _boundingSphere = ...;

     // One of the forwarded calls.
     public ContainmentType Contains(BoundingBox box)
     {
         // Forward the call.
         return _boundingSphere.Contains(box);
     }

     // And so on...
}

もちろん、これらのクラス インスタンスを を期待するメンバーに渡すことはできずBoundingSphere、基礎となる構造を公開するときに、変更を試みて検出する必要があります (インスタンスが参照によって渡されない限り、これはほぼ不可能です)。

ただし、実際にはこれを行う必要はありません。構造の設計者は、おそらく次の理由でそれを構造として選択しました。

  • 変更可能ですが (構造を扱う場合は不可)、有効期間は制限されることを意図しています
  • これらの多くが同時にインスタンス化される可能性があり、これをヒープ上で行うよりもスタック上で行う方が効率的です (そうすると、多数の第 1 世代のガベージ コレクションが発生し、パフォーマンスに確実に影響を与える可能性があります。ゲームプラットフォーム)
于 2012-12-03T20:02:47.257 に答える