クラスまたは構造体型の変数が値型フィールドを公開し、その値型がその内容をフィールドとして公開する場合、それらのフィールドに対する操作は、周囲の変数型のオペランドと同じくらい効率的に実行できます。値の型がプロパティとして公開されている場合、一般的にできる最善の方法は次のようなものです。
var temp = t.Location;
temp.X += 4;
t.Location = temp;
それほどエレガントではありませんが、比較的明確で、ひどく非効率的ではありません。AdjustLocation
別の方法として、次のようなメソッドをタンクに公開させることもできます。
delegate void ActByRef<T1>(ref T1 p1);
void ActOnLocation(ActByRef<Point> proc)
{ proc(ref _Location); }
そしておそらくまた
delegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
void ActOnLocation<PT1>(ActByRef<Point, PT1>, ref PT1 param1)
{ proc(ref _Location, ref param1); }
Location
これらのメソッドは、プロパティが というバッキング フィールドを使用することを前提としています_Location
。コードは次のようになります。
// Add 5 to X
myTank.ActOnLocation( (ref Point loc) => loc.X += 5 );
また
// Add YSpeed to Y
myTank.ActOnLocation( (ref Point loc, ref int param) => loc.Y += param, ref YSpeed);
後者の場合、ラムダ内では も も他のローカル変数も使用されないことに注意してYSpeed
くださいthis
。代わりに、パラメーターYSpeed
として渡されref
ます。そのため、上記のコードが 100 万回実行されたとしても、システムはデリゲートを 1 つ生成するだけで済み、それを毎回再利用できます。
構造が大きい場合、上記のアプローチは、一時変数を使用するアプローチよりも高速になる可能性があります。オーバーヘッドはおそらく小さな構造体をコピーするコストよりも大きくなりますが、オーバーヘッドは構造体のサイズとは無関係です。上記のような構成を使用して一時的なコピーを作成する必要がないようにすれば、サイズが数キロバイトの構造体を効率的に使用できます。