如果类或结构类型变量公开了值类型字段,并且该值类型将其内容公开为字段,则对这些字段的操作可以像对周围变量类型的操作数一样有效地执行。如果值类型作为属性公开,那么最好的方法通常是:
var temp = t.Location;
temp.X += 4;
t.Location = temp;
不是非常优雅,但相对清晰,也不是太低效。另一种方法是让 tank 公开一个方法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);
请注意,在后一种情况下, lambda 中YSpeed
既不this
使用 也不使用任何其他局部变量;相反,YSpeed
作为ref
参数传递。因此,即使上面的代码运行一百万次,系统也只需要生成一个委托,然后每次都可以重复使用。
如果结构很大,则上述方法可能比使用临时变量的方法更快。虽然开销可能大于复制小型结构的成本,但开销与结构大小无关。如果一个人使用像上面这样的结构,那么一个人可以有效地使用大小为几千字节的结构,以避免必须制作临时副本。