1

Rectangle私はクラスにプロパティを持っています。これを受け入れWidthHeight正しくし、通常のを扱っているかのようにそれらを返しますRectangle

Vector2 position;
Rectangle rectangle;
public Rectangle Rect
    {
        get { return rectangle;  }
        set { rectangle = value; position.X = value.X; position.Y = value.Y; }
    }

うまくいくようで、うまく機能します。Width取得または設定したい場合、またはX具体的にしたい場合を除きます。

どうすればそれを可能にできますか?

4

1 に答える 1

2

クラスのセマンティクスが、部外者が調整しても気にしないことを 100% 確信できるようなものである場合はRect、それをフィールドとして公開するだけで、呼び出し元はそのフィールドを直接設定できます。その保証ができない場合はrectangle、コールバック メソッドに渡すメソッドを提供することを検討してください。

delegate void ActionByRef<T1>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2,T3>(ref T1 p1, ref T2 p2, ref T3 p3);
void ActOnRect(ActionByRef<Rectangle> proc)
  { proc(ref rectangle); position.X = value.X; position.Y = value.Y; }
void ActOnRect<TP1>(ActionByRef<Rectangle,TP1> proc, ref TP1 p1)
  { proc(ref rectangle, ref p1); position.X = value.X; position.Y = value.Y; }
void ActOnRect<TP1,TP2>(ActionByRef<Rectangle,TP1> proc, ref TP1 p1, ref TP2 p2)
  { proc(ref rectangle, ref p1, ref p2); position.X = value.X; position.Y = value.Y; }

rectangleこのアプローチにより、メンバーの 1 つを変更するためだけにのコピーを作成する必要がなくなります。おそらく 16 バイトの構造では価値がありませんが、より大きな構造が必要な場合はおそらく価値があります。

3 番目のアプローチは、呼び出し元に次のようなことを要求するだけです。

var r = myThing.Rect;
r.X = 23;
myThing.Rect = r; // Or perhaps myThing.SetRect(R);

私が提案する最後のアプローチは、のパターンに従うことですControl.SetBounds。これには、メンバーを個別のパラメーターとして受け取るオーバーロードが含まれRectangleますが、どのパラメーターまたはパラメーターを の適切なメンバーにコピーするかを指定する追加のパラメーターを取りますBounds

于 2013-01-13T04:41:27.343 に答える