Delphi 2009 Обработка с - PullRequest
       31

Delphi 2009 Обработка с

5 голосов
/ 15 июля 2009

Кто-нибудь знает, что отличает работу Delphi 2009 с "with"?

Я исправил проблему вчера, просто деконструировав «с» к полным ссылкам, как в «с Datamodule, Dataset, MainForm». Delphi 2006 и ранее применили «Закрыть» к набору данных. Delphi 2009 применил «Закрыть» к MainForm и вышел из приложения!

Ответы [ 5 ]

16 голосов
/ 15 июля 2009

Ничего не изменилось. Ваше предыдущее наблюдение было неверным. Объекты, упомянутые в операторе with, считаются «справа налево», поэтому в вашем примере сначала будет выполняться поиск MainForm, затем Dataset, а затем Datamodule. Так было всегда. Это так же, как если бы вы написали это:

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

Иди и проверь документацию по Delphi 2006; там должен быть раздел с именем Объявления и операторы , в котором вы найдете Структурированные операторы , включая раздел С операторами .

Сделайте себе одолжение и не используйте with. Это не вызывает никаких проблем как во время отладки, так и во время обслуживания, когда обслуживание может выполнять даже тот, кто написал код всего за день до этого.

11 голосов
/ 15 июля 2009

With это зло. Я не знаю, сколько раз мне нужно это сказать, но, видимо, мы еще не пришли.

С может использоваться только «безопасно» с объектами, которые никогда не изменятся. Если вы примените его к объектам, которые вы определили в своем собственном проекте, все ставки сняты, и я бы осмелился сказать, что вы должны просто использовать части «если Random (50) <25» для выполнения вашего кода, по крайней мере, документировано, что оно выполняется странным образом. </p>

Проблема в том, что, как только вы начнете связываться с объектом, введете новые методы или свойства или переименуете старые, все существующие with заявления, которые используют эти методы, могут изменить смысл. И не в "Предупреждение: вызов неоднозначного метода" тоже изменить. Код просто сделает что-то другое, чем это было ранее. Не говоря тебе об этом.

Например, предположим, у вас есть это:

with connection, file do
begin
    Close;
end;

тогда что вы ожидаете? Ну, это естественно, чтобы закрыть файл, поэтому я ожидаю, что файл будет закрыт. Предположим далее, что эта файловая переменная содержит объект типа TSomeOddFile, который не определяет метод Close, а скорее метод CloseFile. Приведенный выше оператор With затем закроет соединение.

Все хорошо, это задокументировано, никто не писал этот кусок кода, думая, что файл будет закрыт, в конце концов, метод для этого объекта называется CloseFile, это просто мое предположение, что это неправильно, и я не работаю над проект. Тем не менее.

И тогда кто-то исправляет это, переименовывая CloseFile в Close. Приведенный выше код автоматически начнет закрывать файл вместо соединения. Нет предупреждения, нет ошибки, компилируется так же хорошо, как и до того, как вы изменили имя метода. Работает так же хорошо ^ h ^ h ^ h, не ждите, это не будет.

Так что да, with укусит вас в а **.

3 голосов
/ 15 июля 2009

Компилятор, как правило, довольно солидный, поэтому я бы не допустил ошибку или изменение, пока вы действительно не исключили все остальное. Некоторые вещи, о которых я могу быстро подумать:

1) Посмотрите, используете ли вы перегруженные функции или операторы. Поскольку определение STRING (и нескольких других типов) изменилось, можно выбрать другой вариант, поскольку сигнатура эффективно изменяется.

2) может также случиться так, что некоторый включенный блок теперь определяет идентификатор, который уже используется, и имеет приоритет над идентификатором, выставленным в другом блоке.

Если нет, начните выделять код в минимальном примере, используя как можно меньше единиц. Делайте это шаг за шагом, поскольку хитрость заключается в том, каким было последнее изменение, когда изменилось поведение.

Опубликуйте это (или URL) здесь, это всегда интересно посмотреть.

3 голосов
/ 15 июля 2009

Использование with A,B,C,D - плохая практика, поскольку изменения в других модулях могут внезапно привести к тому, что ваш код перестанет работать должным образом. См. здесь для получения дополнительной информации или здесь (поиск "with keyword").

1 голос
/ 15 июля 2009

С..до следует использовать с осторожностью. В противном случае это бесконечный источник головной боли .... Я согласен с Робом Кеннеди и другими.

Как Крейг Штунц ( в другом посте о с ..до ) и Лассе В. Карлсен выше сказал, с..до может создать много ловушек.

...