¿Por qué no con ... hacer una declaración y el rectángulo funcionan juntos sin problemas?
-
26-10-2019 - |
Pregunta
Últimamente, he notado que cada vez que uso la variable rectángulo con Con hacer Declaración, no funciona en absoluto por alguna razón.
Por ejemplo:
var bounds:=new Rectangle(0,0,0,0);
with bounds do
begin
X:=1;
Y:=2;
Width:=33;
Height:=44;
end;
Los valores de los límites siguen siendo ceros, no lo que hay en la declaración con la declaración. Sin embargo, si hago lo siguiente, funciona muy bien.
var bounds:=new Rectangle(0,0,0,0);
bounds.X:=1;
bounds.Y:=2;
bounds.Width:=33;
bounds.Height:=44;
¿Hay alguna razón por la que haría eso?
Solución
Lo que Hans Passant está tratando de implicar es que la declaración "con" crea una copia de los límites, funciona y luego la tira. No tengo suficiente información para verificar eso, pero creo que es poco probable: el operador de asignación de Delphi funciona por referencia, por lo que las copias superficiales implícitas en realidad no suceden tan a menudo.
Sin embargo, "con" declaraciones intencionalmente crean un tipo especial de infierno de alcance variable. Podría estar agarrando un campo dentro de los límites, o podría tomar un campo del método de contención, o incluso podría estar agarrando un campo de una declaración anterior "con" con "con". La refactorización automática no puede tocar A con la declaración. Agregar un campo a la clase en que funciona la declaración con la declaración puede romper su método.
Considerar
with myLongNamedComponent.anotherLongNamedChild.pedanticRectangle do
begin
x:=1;
y:=2;
width:=33;
height:=44;
end;
Esto en realidad está mejor escrito como
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; La declaración "con" ya no se considera una buena práctica de codificación.