C#: существует ли Преимущество для Расположения Ресурсов в обратном порядке их Выделения?

В настоящее время нет способа удалить приложение GAE.

5
задан Bob Kaufman 9 November 2009 в 19:30
поделиться

5 ответов

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

Однако многие плохо созданные библиотеки не проводят надлежащую проверку. Распределение ресурсов в обратном порядке по сравнению с их распределением обычно означает, что вы сначала избавляетесь от ресурса, зависящего от других ресурсов, что может предотвратить проблемы с плохо написанными библиотеками. (Вы никогда не избавляетесь от ресурса, а затем используете тот, который зависит от наличия первого в этом случае.)

Это также хорошая практика, поскольку вы не собираетесь случайно удалить ресурс, требуемый каким-либо другим объектом, слишком рано.

Вот пример: посмотрите на операцию с базой данных. Вы не хотите закрывать / удалять свое соединение перед закрытием / удалением вашей команды (которая использует соединение).

5
ответ дан 13 December 2019 в 22:10
поделиться

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

Кроме того, если вы удаляете ссылки A и B и A, то не имеет значения, удаляет ли A B, когда вы удаляете A, поскольку метод Dispose должен вызываться более одного раза без создания исключения.

4
ответ дан 13 December 2019 в 22:10
поделиться

Вложенные 'usings' показывают, что 'outlived' на самом деле не работает и редко (чтобы не сказать никогда после 40 лет доказательств) .. И это включает в себя основанные на стеке ВМ, работающая, скажем, на CMOS.

[Несмотря на некоторые попытки MSDN.com и Duffius заставить его исчезнуть, вы знаете, как справиться со всем этим за вас - разница между кучей и стеком. Какая умная идея .. в космосе]

0
ответ дан 13 December 2019 в 22:10
поделиться

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

Если вы имеете в виду вызов IDisposable.Dispose (), то это зависит от поведения объектов, реализующих интерфейс IDisposable.

В общем, порядок не имеет значения для большинства Framework объекты, за исключением тех случаев, когда это имеет значение для вызывающего кода. Но если объект A поддерживает зависимость от объекта B, а объект B удален, тогда может быть очень важно не делать определенные вещи с объектом A.

В большинстве случаев Dispose () вызывается не напрямую, а скорее он неявно вызывается как часть оператора using или foreach, в этом случае закономерно возникнет паттерн обратного порядка, согласно внедрению оператора.

using(Foo foo = new Foo())
using(FooDoodler fooDoodler = new FooDoodler(foo))
{
  // do stuff
  // ...
  // fooDoodler automatically gets disposed before foo at the end of the using statement.
}
1
ответ дан 13 December 2019 в 22:10
поделиться

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

http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

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

(Это примерно то, что Уилл сказал выше)

0
ответ дан 13 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

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