Почему с ... делать оператор и прямоугольник не работают безупречно? - PullRequest
4 голосов
/ 30 ноября 2011

В последнее время я замечал, что всякий раз, когда я использую переменную Rectangle с с оператором ... do , по какой-то причине он вообще не работает.

Например:

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

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

значения границ остаются нулями, а не в выражении with. Однако, если я сделаю следующее, это прекрасно работает.

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

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

Есть ли причина, по которой он это сделал?

1 Ответ

1 голос
/ 26 декабря 2011

Ханс Пассант пытается понять, что выражение «с» создает копию границ, работает с ней, а затем выбрасывает ее. У меня недостаточно информации, чтобы это проверить, но я чувствую, что это маловероятно - оператор присваивания Delphi работает по ссылке, поэтому неявные мелкие копии на самом деле случаются не так часто.

Однако операторы with намеренно создают особый вид переменной области видимости. Вы могли бы захватывать поле внутри границ, или вы могли захватывать поле из содержащего метода, или вы могли бы даже захватывать поле из предыдущего незамкнутого оператора «with». Автоматический рефакторинг не может касаться оператора with. Добавление поля в класс, с которым работает оператор with, может нарушить ваш метод.

Рассмотрим

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; оператор with больше не считается хорошей практикой кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...