Ключевое слово C# USING - когда и когда его не использовать?

Я хотел бы знать, когда я должен и не должен оборачивать вещи в блок USING.

Насколько я понимаю, компилятор переводит его в try / finally, где finally вызывает Dispose () для объекта.

Я всегда использую ИСПОЛЬЗОВАНИЕ при подключении к базе данных и доступе к файлам, но это больше по привычке, чем со стопроцентным пониманием. Я знаю, что вам следует объяснять (или использовать) объекты Dispose (), которые управляют ресурсами, чтобы гарантировать, что они высвобождаются мгновенно, а не всякий раз, когда CLR считает нужным, но именно здесь мое понимание нарушается.

Не утилизируются ли IDisposables, когда они выходят за рамки?

Нужно ли мне использовать USING только тогда, когда мой объект использует Dispose для того, чтобы привести себя в порядок?

Спасибо

Обновлено: я знаю, что есть несколько других сообщений по ключевому слову USING, но меня больше интересуют ответы, касающиеся CLR и того, что происходит внутри

Андрей

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
0
13 528
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Нет, предметы IDisposable не утилизируются, когда они выходят за рамки. Именно по этой причине нам нужен IDisposable - для детерминированной очистки.

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

Интересно (возможно), что бывают случаи, когда "использование" вызывает боль - когда нарушающий класс иногда выдает исключение на Dispose(). WCF нарушает это. Я обсуждал эту тему (с простым обходным путем) здесь.

По сути - если класс реализует IDisposable, и вы своя экземпляр (т.е. вы его создали или что-то еще), ваша задача - убедиться, что он будет удален. Это может означать «использование» или передачу его другому фрагменту кода, который берет на себя ответственность.

Я действительно видел отладочный код типа:

#if DEBUG
    ~Foo() {
        // complain loudly that smoebody forgot to dispose...
    }
#endif

(где Dispose вызывает GC.SuppressFinalize)

И если вы все же используете эту технику, пожалуйста, пожалуйста, не забывайте '#if DEBUG'. Это вы, я имею в виду JetBrains, с вашими 30000 объектами в очереди финализатора Visual Studio ...

Will Dean 25.11.2008 15:46

+1, я бы хотел проголосовать больше одного раза: p ... отличные знания делятся на stackoverlow .... это просто здорово ...

Mayank Pathak 27.07.2012 08:50

"Are IDisposables not disposed of when they go out of scope?"

Нет. Если объект IDisposable - финализируемый, что не одно и то же, то он будет завершен при сборке мусора.

Что может случиться скоро, а может быть, почти никогда.

Книга Джеффа Рихтера по C# / CLR очень хороша во всем этом, и книга Framework Design Guidelines также полезна.

Do I only need to use a USING when my object makes use of Dispose to tidy itself up?

Вы можете Только использовать 'using', когда объект реализует IDisposable. Компилятор возразит, если вы попытаетесь поступить иначе.

Чтобы добавить к другим ответам, вы должны использовать using (или явное Dispose) всякий раз, когда объект содержит какие-либо ресурсы, кроме управляемой памяти. Примерами могут быть такие вещи, как файлы, сокеты, соединения с базой данных или даже дескрипторы рисования GDI.

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

Возможно, вам следует просто использовать "using" всякий раз, когда класс реализует IDisposable. Что он делает, так это деталь реализации ;-p Это финализатор, который вы должны добавлять только в том случае, если ваш класс обертывает неуправляемый ресурс. Есть примеры IDisposable в чисто управляемом коде ...

Marc Gravell 25.11.2008 16:12

Хороший комментарий, должен был стать ответом на голосование любовь xx

Andrew Bullock 25.11.2008 16:13

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

babbageclunk 30.11.2008 01:51

Другие вопросы по теме