В Visual C # нет деструктора? - PullRequest
0 голосов
/ 04 мая 2011

Как я понимаю, синтаксис деструктора (~ ClassName) в C # - это способ написать финализатор.Этот метод становится методом Finalize после компиляции в IL.

Итак, это означает, что язык программирования C # поддерживает деструкторы, но Visual C # как часть .net framework не позволяет программистам использовать его.

РЕДАКТИРОВАТЬ: я знаю, что можно использовать интерфейс IDisposable для очистки неуправляемых ресурсов.Вопрос не об этом.Вопрос в том, есть ли деструкторы в Visual C #?Поскольку синтаксис деструкторов - это способ написать финализатор => нет способа определить сам деструктор.

Ответы [ 7 ]

4 голосов
/ 04 мая 2011

Деструкторы, как правило, необходимы на других языках (например, c ++) для очистки памяти. Поскольку C # является сборщиком мусора, деструктор полезен только для очистки ресурсов, которые в противном случае не были бы автоматически очищены.

2 голосов
/ 04 мая 2011

Я не совсем согласен с вашим утверждением:

Итак, это означает, что программирование на C # язык поддерживает деструкторы, но Visual C # как часть .net Framework не позволяет программистам использовать его.

Да, вы можете написать финализатор (деструктор) на C #, и он позволит вам очистить любые неуправляемые ресурсы, которые вам нужны, перед тем, как объект будет собран мусором. Тем не менее, вы должны быть осторожны, чтобы реализовать это правильно (шаблон утилизации приходит на ум).

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

1 голос
/ 04 мая 2011

Вопрос в том, существуют ли деструкторы в Visual C #?Поскольку синтаксис деструкторов является способом написания финализатора => нет способа определить сам деструктор

Вероятно, ответ на ближайшее совпадение: Нет, нет детерминированного деструкторы (как вы их знаете, например, из C ++) в C # или любом из языков, скомпилированных для проверяемого и безопасного выполнения CLR.

1 голос
/ 04 мая 2011

Наиболее близким к деструкторам является интерфейс IDisposable и его метод Dispose().С помощью конструкции using(){} вы можете сделать вызов Dispose () детерминированным, завершив тем самым почтенный шаблон RAII.

0 голосов
/ 21 декабря 2011

В языке C # есть вещи, называемые "деструкторы", семантика которых не имеет никакого отношения к деструкторам в C ++.Несмотря на то, что имя является неудачным, «деструктор» является стандартным термином для синтаксического элемента C #, который начинается с тильды и имени класса и который запрашивает компилятор сгенерировать переопределение Finalize (), которое вызывает предоставленный код, а затемвызывает base.Finalize ().Довольно глупая и бессмысленная языковая конструкция (просто позволяющая коду переопределять Finalize () была бы менее запутанной; привязка имени Finalize () к языку была бы незначительной проблемой по сравнению с привязкой в ​​GC.KeepAlive () и GC.SuppressFinalize(), которые обычно требуются в правильно написанной программе, использующей деструкторы).

Кстати, имя «деструктор» иронично, поскольку деструкторы на самом деле не уничтожают объекты, а предоставляют объекты, который в противном случае был бы уничтожен с отсрочкой в ​​последнюю секунду, чтобы привести свои дела в порядок.

0 голосов
/ 04 мая 2011

Простой ответ заключается в том, что вы можете написать деструкторы, чтобы помочь с управлением памятью и т. Д., Но вы не можете явно вызывать их.Вы реализуете интерфейс IDisposable и явно вызываете метод Dispose (), если вам нужно.Разрушитель присутствует для использования системой сбора мусора.Обычно он проверяет, удален ли ваш объект, и затем вызывает тот же метод Dispose ().

По сути, он есть, если вы забыли явно утилизировать, а сборщик мусора должен выполнить очистку после вас: -)

Визуальный бит действительно не имеет значения.

0 голосов
/ 04 мая 2011

Вы можете реализовать интерфейс IDisposable для создания своего рода деструктора (метод Dispose ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...