Question

Ces derniers temps, j'ai remarqué que chaque fois que j'utilise la variable Rectangle avec Avec ... faire déclaration, il ne fonctionne pas du tout pour une raison quelconque.

Par exemple:

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

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

Les valeurs de zéros Bounds restent pas ce qui est dans l'instruction with. Toutefois, si je fais ce qui suit, il fonctionne très bien.

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

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

Y at-il des raisons pour lesquelles il le ferait.

Était-ce utile?

La solution

Qu'est-ce que Hans tente de Passant entendre est que « avec » la déclaration crée une copie des limites, fonctionne sur elle, puis le jette. Je n'ai pas assez d'informations pour vérifier que, mais je pense qu'il est peu probable -. Opérateur d'affectation de Delphi fonctionne par référence, donc des copies peu profondes implicites ne fait pas que se produisent souvent

Cependant, « avec des » énoncés créer intentionnellement un type particulier de l'enfer de la portée des variables. Vous pourriez saisir un champ à l'intérieur des limites, ou vous pourriez saisir un champ à partir de la méthode contenant, ou vous pourriez même être saisissant un champ d'un précédent non fermé « avec » déclaration. refactoring automatique ne peut pas toucher une avec déclaration. Ajout d'un champ à la classe avec la déclaration fonctionne sur peut briser votre méthode .

Considérons

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

Il est en fait mieux écrit que

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; le « par » déclaration est plus considérée comme une bonne pratique de codage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top