With
это зло. Я не знаю, сколько раз мне нужно это сказать, но, видимо, мы еще не пришли.
С может использоваться только «безопасно» с объектами, которые никогда не изменятся. Если вы примените его к объектам, которые вы определили в своем собственном проекте, все ставки сняты, и я бы осмелился сказать, что вы должны просто использовать части «если Random (50) <25» для выполнения вашего кода, по крайней мере, документировано, что оно выполняется странным образом. </p>
Проблема в том, что, как только вы начнете связываться с объектом, введете новые методы или свойства или переименуете старые, все существующие with
заявления, которые используют эти методы, могут изменить смысл. И не в "Предупреждение: вызов неоднозначного метода" тоже изменить. Код просто сделает что-то другое, чем это было ранее. Не говоря тебе об этом.
Например, предположим, у вас есть это:
with connection, file do
begin
Close;
end;
тогда что вы ожидаете? Ну, это естественно, чтобы закрыть файл, поэтому я ожидаю, что файл будет закрыт. Предположим далее, что эта файловая переменная содержит объект типа TSomeOddFile, который не определяет метод Close, а скорее метод CloseFile. Приведенный выше оператор With затем закроет соединение.
Все хорошо, это задокументировано, никто не писал этот кусок кода, думая, что файл будет закрыт, в конце концов, метод для этого объекта называется CloseFile, это просто мое предположение, что это неправильно, и я не работаю над проект. Тем не менее.
И тогда кто-то исправляет это, переименовывая CloseFile в Close. Приведенный выше код автоматически начнет закрывать файл вместо соединения. Нет предупреждения, нет ошибки, компилируется так же хорошо, как и до того, как вы изменили имя метода. Работает так же хорошо ^ h ^ h ^ h, не ждите, это не будет.
Так что да, with
укусит вас в а **.