1

Изучаю теоретические вопросы (52 вопроса буржуских для Сеньера) и не совсем понимаю что за паттерн такой. Понимаю что такое сборщик мусора, понимаю как он работает, понимаю его стадии работы, как то маркировка объектов, сжатие, очистка поколения 0, далее поколение 1, и поколение 2. Можно вызвать на объекте финализатор, который будет очищать все неуправляемые ресурсы у объекта перед работой сборщика. И есть Disposable паттерн, суть которого в том, что на объекте реализуется интерфейс Idisposable, в котором вызывается один метод. И получается, суть этого паттерна только в том чтобы вызвать этот метод и сообщить сборщику мусора что объект подлежит очистке или я как ко не так все понял?

  • 2
    в буржунетах искали? Это же в доках есть – tym32167 May 10 '19 at 08:25
  • 1
    Сборщику мусора дела нет до Dispose метода, для него имеет значение только наличие финализатора. – tym32167 May 10 '19 at 08:27
  • если говорить про интеграцию IDisposable в C# - то это только качается конструкции using. Конструкция using по сути сахар, который вам код сокращает, и всё. – tym32167 May 10 '19 at 08:28
  • @tym32167 Да я в доках смотрел но я не совсем понимаю логики, тогда получается что, паттерн запускает как раз сборщик мусора с финализатором. – Vladimr Vladimirovoch May 10 '19 at 08:28
  • то есть вы можете не реализоввывать вовсе IDisposable, писать свой костыль DisposeMyStuff(){....}, который будет освобождать ресурсы, вызывать этот свой костыль из финализатора и из кода и всё будет работать. – tym32167 May 10 '19 at 08:29
  • паттерн ничего не запускает, он помогает не допускать ошибок в коде и всего то. – tym32167 May 10 '19 at 08:30
  • @tym32167 да Using по сути это try и finaly в try пробуем очистить ресурсы,а в finaly вызываем GC с финализатором. – Vladimr Vladimirovoch May 10 '19 at 08:31
  • 1
    нет, в finally вы вызывете Dispose метод, финализатор вызывается только сборщиком мусора в неопределенное время в процессе уничтожения объекта – tym32167 May 10 '19 at 08:32
  • @tym32167 Ну а если на вопрос что такое этот паттерн ответить,что он позволяет не допускать ошибок и вызывать сборщик с финализатором это же будет не корректно ? Или нет – Vladimr Vladimirovoch May 10 '19 at 08:33
  • по большому счету, расчет иет такой: есть using, он позволяет освобождать ресурсы кодом программиста. Но если программист не очень, и забыл использовать using, есть финализатор, в котором тоже ижет вызов dispose. – tym32167 May 10 '19 at 08:34
  • нет, некорректно, если поглядите в паттерн, увидите, что в Dispose() методе есть строчка GC.SuppressFinalize(this);, что означает дословно если прогер вызвал этот метод, то не надо этот объект финализировать, так как этот метод и так все почистит/освободит – tym32167 May 10 '19 at 08:36
  • 1
    то есть паттерн предусматривает 2 взаимоисключающих способа освобождения захваченных ресурсов 1) вызовом dispose() ручками или юзингом с освобождением управляемых и неуправляемых ресурсрв 2) вызовом финализатора с освобождением неправляемых ресурсов – tym32167 May 10 '19 at 08:38
  • 1
  • вызывет сам прогер, 2) - вызывает GC, если прогер забыл вызвать первый пункт.
  • – tym32167 May 10 '19 at 08:39
  • @MSDN.WhiteKnight тут все таки не совсем тот вопрос, тут же не про то, зачем надо IDisposable, а про то, что из себя представляем конкретный кусок кода - Dispose паттерн, реккомендованный MS - я в том ответе этот паттерн не увидел. – tym32167 May 10 '19 at 08:45