Когда я должен расположить свои объекты в.NET?

Для общего кода я должен действительно расположить объект? Я могу просто проигнорировать его по большей части, или действительно ли это - хорошая идея всегда расположить объект, когда Ваши 100%, уверенных, Вам больше не нужен он?

18
задан Edgar Rokjān 20 August 2017 в 15:48
поделиться

8 ответов

Причина, которую необходимо всегда называть Dispose() на любом типе, который реализует IDisposable, состоит в том, что он обычно используется, чтобы показать, что тип получает неуправляемые ресурсы. Особенно важно, чтобы они были освобождены, и как можно раньше. Как другие упомянули, using предпочтенный способ сделать это.

6
ответ дан 30 November 2019 в 06:51
поделиться

Если объект реализует IDisposable, необходимо избавиться от него, как только Вы сделаны с ним. Самый легкий путь состоит в том, чтобы окружить его использование блок:

using (SqlCommand cmd = new SqlCommand(conn)) {
    cmd.ExecuteNonQuery();
}
15
ответ дан 30 November 2019 в 06:51
поделиться

Существует несколько способов посмотреть на него. Один путь пытается выяснить, действительно ли необходимо избавиться от объекта, как только это больше не необходимо, например, с помощью Отражателя, чтобы видеть, содержит ли это действительно на неуправляемые ресурсы, или если от них случайно избавились так или иначе. Другая перспектива состоит в том, чтобы предположить, что, если объект реализует IDisposable, это не Ваш бизнес, чтобы определить, располагают ли (), действительно должен быть назван - Вы всегда называете его. Я думаю, что это - правильный способ пойти. Заглядывание в частную реализацию объектов принять решения относительно того, как необходимо использовать их, увеличивает риск того, чтобы быть связанным с реализацией, которая могла измениться. Примером является LINQ к SQL DataContext. Это реализует IDispose, но главным образом моется после себя без потребности в явном вызове для Расположения (). Мое предпочтение состоит в том, чтобы написать код, который явно располагает так или иначе, но другие предложили не необходимый.

, Конечно, это все относится к объектам та реализация IDisposable. Это верно, что GC будет заботиться о большинстве все остальное без любого явного действия с Вашей стороны, но это стоит считать немного на тонкости поведения GC (я также устал для размышления о деталях прямо сейчас) знать, когда избавиться от объектов явно, и что еще более важно, когда реализовать IDispose. Существует много хороших статей о межсетях по вопросу.

И, как сказано ранее, с помощью (..) {...} Ваш друг для конструкторов IDisposable.

3
ответ дан 30 November 2019 в 06:51
поделиться

Избавьтесь от объекта, момент Ваш сделан с ним. Доступные объекты представляют объекты, содержащие ценный ресурс, о котором внутренне не знает CLR. Следовательно, GC также не знает о ресурсах и не может принять интеллектуальные решения относительно того, когда он должен собрать доступный объект и следовательно освободить базовый ресурс.

В конечном счете GC будет чувствовать давление памяти и собирать Ваш объект по совпадению (ничто больше). Если Вы не избавляетесь от объектов детерминированным способом затем, абсолютно возможно войти, ресурс исчерпал ресурсы состояние почти ни с каким давлением памяти.

Быстрый пример того, как это может произойти. Позволяет думают о базовом ресурсе как о дескрипторе Win32. Они являются очень конечными и довольно маленькими. Вы выполняете операцию, которые создают много объектов Foo. Foo возражает реализации IDisposable и ответственен за создание и избавление от дескриптора Win32. Они вручную не освобождены, и различием причуда превращает его в "кучу" Gen2. Эта "куча" освобождается справедливо нечасто. Со временем достаточно экземпляров Foo превращает его в "кучу" Gen2 для приведения в рабочее состояние всех доступных дескрипторов. Новые объекты Foo, следовательно, не могут быть созданными независимо от того, сколько памяти используется.

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

26
ответ дан 30 November 2019 в 06:51
поделиться

Если объект реализовал IDisposable, довольно вероятно, что он держится за неуправляемые ресурсы. Эмпирическое правило, поэтому, состояло бы в том, чтобы звонить, Располагают момент, Вы сделаны с объектом, или непосредственно или через блок использования. Не полагайтесь на GC, так как это - то, что IDisposable для - детерминированный выпуск ресурсов.

1
ответ дан 30 November 2019 в 06:51
поделиться

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

можно постараться не звонить, Располагают путем написания кода освобождения в, Завершают метод, но затем Вы зависите от Сборщика "мусора", потому что Вы никогда не уверены чем тогда, когда Сборщик "мусора" завершит Ваш объект. Чтобы быть на безопасной стороне при разработке такого класса, который содержит неуправляемый ресурс, можно написать тот же освобождающий объект код и в Расположить И Завершить метод, но если Вы действительно так, всегда используете SuppressFinalize () в Вашем располагать метод, потому что это предотвратит Завершение () метод от того, чтобы быть названным, если Ваш объект уже будет на Очереди Завершения.

0
ответ дан 30 November 2019 в 06:51
поделиться

Доверие GC 'работает' в большинстве экземпляров. Классическое исключение - когда у Вас есть ресурс, тяжелое взаимодействие - в том экземпляре лучше explicilty располагать.

очевидный, например,

using (var conn = new SqlConnection(connString)) {}

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

0
ответ дан 30 November 2019 в 06:51
поделиться

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

-7
ответ дан 30 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

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