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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top