C#: (верные) ResumeLayout делают то же как ResumeLayout (ложь) + PerformLayout ()?

Проблема с Вашей мелкой копией - то, что все объекты не клонированы. В то время как ссылки на каждый объект уникальны в каждом массиве, как только Вы в конечном счете захватываете на него, Вы имеете дело с тем же объектом как прежде. Нет ничего неправильно со способом, которым Вы клонировали его... тот же результат произойдет с помощью Array.slice ().

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

, Если структура данных не может быть представлена как направленный граф без петель, то я не уверен, что Вы собираетесь быть способными найти универсальный метод для глубокого клонирования. Циклические графики обеспечивают много хитрых угловых случаев, и так как это не общая операция, я сомневаюсь, что любой записал полное решение (если это даже возможно - это не могло бы быть! Но у меня нет времени пытаться записать строгое доказательство теперь.). Я нашел некоторые хорошие комментарии к проблеме о эта страница .

, Если Вам нужна глубокая копия Массива Объектов с циклическими ссылками, я полагаю, что Вы оказываетесь перед необходимостью кодировать свой собственный метод для обработки специализированной структуры данных, такой, что это - многопроходный клон:

  1. На круглом, сделайте клон всех объектов, которые не ссылаются на другие объекты в массиве. Отслеживайте источники каждого объекта.
  2. На круглых двух, соедините объекты.

11
задан Kara 10 December 2013 в 07:23
поделиться

2 ответа

Использование отражателя:

this.ResumeLayout() is equal to this.ResumeLayout(true)

Но

this.ResumeLayout(true) is not equal to this.ResumeLayout(false) + this.PerformLayout()

Причина:
Когда ResumeLayout вызывается со значением false, существует циклическая коллекция элементов управления, и LayoutEngine вызывает InitLayout для каждого элемента управления в макете.

6
ответ дан 3 December 2019 в 10:04
поделиться

SuspendLayout

При добавлении нескольких элементов управления в родительский контроль, рекомендуется вы вызываете метод SuspendLayout перед инициализацией элементов управления добавлен. После добавления элементов управления в родительский элемент управления, вызовите ResumeLayout метод. Это будет повысить производительность приложения с множеством элементов управления.

PerformLayout

Заставляет элемент управления применять макет логика для всех его дочерних элементов управления. Если метод SuspendLayout был позвонил, прежде чем позвонить PerformLayou t событие Layout подавляется. Событие макета можно подавить с помощью SuspendLayout и Методы ResumeLayout.

Ссылка MSDN - Метод PerformLayout

4
ответ дан 3 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

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