最近,我一直在注意到我随时使用矩形变量 与...做 声明,由于某种原因,它根本不起作用。

例如:

var bounds:=new Rectangle(0,0,0,0);

with bounds do
begin
  X:=1;
  Y:=2;
  Width:=33;
  Height:=44;
end;

边界的值仍然是零,而不是语句中的内容。但是,如果我执行以下操作,它效果很好。

var bounds:=new Rectangle(0,0,0,0);

bounds.X:=1;
bounds.Y:=2;
bounds.Width:=33;
bounds.Height:=44;

有什么理由这样做。

有帮助吗?

解决方案

Hans Passant试图暗示的是,“带有”陈述创建了界限的副本,在其上工作,然后将其扔掉。我没有足够的信息来验证这一点,但是我觉得这不太可能 - Delphi的作业运营商通过引用工作,因此隐含的浅副本实际上并不经常发生。

但是,“带有”陈述有意创建一种特殊的可变范围地狱。您可能会在边界内抓取字段,或者您可能正在从包含方法中抓住字段,或者您甚至可以从先前未封闭的“带有”语句中抓住字段。自动重构无法用语句触摸。将字段添加到课堂上的语句操作可能会破裂 您的 方法。

考虑

with myLongNamedComponent.anotherLongNamedChild.pedanticRectangle do
begin
    x:=1;
    y:=2;
    width:=33;
    height:=44;
end;

这实际上是更好地写的

var bounds := new Rectangle(0,0,0,0);
bounds.x := 1;
bounds.y := 2;
bounds.width := 33;
bounds.height := 44;
myLongNamedComponent.anotherLongNamedChild.pedanticRectangle := bounds;

TL:DR; “带有”陈述不再被视为良好的编码实践。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top