クラスのセマンティクスが、部外者が調整しても気にしないことを 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
。