为什么不……陈述和矩形完美地合作?
-
26-10-2019 - |
题
最近,我一直在注意到我随时使用矩形变量 与...做 声明,由于某种原因,它根本不起作用。
例如:
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; “带有”陈述不再被视为良好的编码实践。
不隶属于 StackOverflow