Delphi 2009, обрабатывая с

Используйте перечисление:

public enum Foo {
    INSTANCE;
}

Joshua Bloch объяснил этот подход в его Эффективный Java, Перезагруженный разговор на Google I/O 2008: ссылка на видео . Также посмотрите слайды 30-32 из его представления ( effective_java_reloaded.pdf ):

Правильный Способ Реализовать сериализуемое Редактирование Singleton

public enum Elvis {
    INSTANCE;
    private final String[] favoriteSongs =
        { "Hound Dog", "Heartbreak Hotel" };
    public void printFavorites() {
        System.out.println(Arrays.toString(favoriteSongs));
    }
}

: часть онлайн "Эффективного Java" говорит:

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

5
задан Shog9 4 March 2010 в 20:15
поделиться

5 ответов

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

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

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

Сделайте сами отдавайте предпочтение и не используйте с . Не вызывает проблем как во время отладки, так и во время обслуживания,

16
ответ дан 18 December 2019 в 05:31
поделиться

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

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

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

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

with connection, file do
begin
    Close;
end;

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

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

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

Так что да, с укусит вас в задницу.

11
ответ дан 18 December 2019 в 05:31
поделиться

The compiler is usually quite solid, so I wouldn't assume a bug or change before you really excluded everything else. Some things I can quickly think of:

1) Look if you use overloaded functions or operators. Since the definition of STRING (and several other types) changed, a different variant can be chosen, because the signature effectively changes.

2) it can also be that some included unit now defines an identifier that is already used, and taking precedence over the one exposed in an different unit.

If not, start isolating the code in a minimal example, using as little units as possible. Do it step by step, since the trick is what the last change was when the behaviour changed.

Post that (or an URL) here, it is always interesting to see.

3
ответ дан 18 December 2019 в 05:31
поделиться

Using with A,B,C,D is bad practice since changes to other units can suddenly cause your code to stop working as expected. See here for more information, or here (search for "with keyword").

3
ответ дан 18 December 2019 в 05:31
поделиться

With..do is to be used with care. Otherwise, is a infinite source of headaches.... I agree with Rob Kennedy and others.

As Craig Stuntz (in other post about with..do) and Lasse V. Karlsen above said, with..do can create a lot of traps.

1
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: