Как принудительно удалить объект в C#? - вопрос №319644

Есть обьект, например:

MyClass myClassObject;

Инициализирую его:

myClassObject = new MyClass();

Затем после махинаций с ним мне нужно его принудительно удалить, как это сделать? 

03.08.12
3 ответа
С#

Лучший ответ по мнению автора

и деструкторы и IDisposable нужны тогда когда собственный класс захватывает внешние ресурсы долговременно и надо гарантировать их освобождение при удалении экземпляра класса неизвестно когда внешним по отношению к нему кодом

вообще это следующий уровень сложности

а удаление экземпляра класса как таковое — обнуление все ссылок на него

и ни чего более

ps деструкторы и IDisposable вызываются обычно только сборщиком мусора (для .net)

pps автоматическая сборка мусора как раз и является достоинством во многих системах программирования

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

автоматическая сборка мусора позволяет не тратить время разработку кода удаления и сосредоточиться на прикладных аспектах программы

платой за это является затрата вычислительных ресурсов на автоматическую фоновую обработку сборки мусора. но обычно это мизерные затраты на фоне общего обьема вычислений

на практике выирыш в упрощени разработки многократно перевешивает проигрыш в производительности по сравнению полностью ручным программированием удаления в том же C++

и что еще важнее — избавляет от большого риска ошибок при ручном программировании удаления обьектов

ppps ответ конкретно для приведенного фрагмента кода

myClassObject = null;

при условии что ни где не было конструкций типа

var MyAnotherObject = myClassObject;

return myClassObject;

и подобных, а если были, то другие переменные должны быть обнулены или завершен контекст видимости переменной

например

MyClass myClassObject;

myClassObject = new MyClass();

{

   var MyAnotherObject = myClassObject;

}

myClassObject = null;

по окончанию такого кода обьект перестанет существовать

так как нет ссылок на него, остается только фрагмент памяти который он занимал

в качестве этого обьекта он уже не может быть использован в принципе

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

03.08.12
Лучший ответ по мнению автора

Другие ответы

экземпляр класса прекращает существовать как только на него нет ни одной действующей ссылки:

— при выходе из контекста видимости, при условии что ссылка не передается как результат функции и не присваивается внешней переменной

— в переделах контекста видимости путем присвоения переменной значения null, при тех же самых условиях и условии что это была единственная (или последняя) переменная указывавшая на экземпляр класса

дополнительно:

если речь идет об освобождении памяти — можно вызывать принудительную очистку мусора (гугл в помощь)

так же следует отдавать себе отчет, что корректное завершение существования обьекта, который использует внешние ресурсы (открытые файлы, сетевые соединения, выделение памяти и создание обьектов в неуправляемом коде и т.д.) зависит от корректного освобождения ресурсов. изучайте назначение опреатора using (не путать с директивой using) и блока finally в исключениях

ps если же интересуют деструкторы, то надо формулировать вопрос по другому

03.08.12

Твой класс должен быть наследован от интерфейса IDisposable

private class myclass: IDisposable<br {<br }

ну и нужно реализовать функцию Dispose()

Потом можно использовать:

1. 

using (Font font1 = new Font("Arial", 10.0f)) { byte charset = font1.GdiCharSet;} // перестаёт существовать font1 2. MyClass myclass = new MyClass();....myclass.Dispose();
03.08.12

Благодарю за ответы, myObject = null — действительно сработало, т.к ошибка из-за обьекта перестала вылазить. Евгений, спасибо за удобночитаемый код :), я реализовал в объекте Dispose(), унаследовал его от IDisposable, метод Dispose() оставил пустым, ибо base.Dispose() не было (тут скорее всего мое незнание теории).

Ошибка была такая: при создании объекта глобального перехвата клавиш, при вводе текста в компонент textbox (речь идет о WPF), вылазила ошибка об обратном вызове делегата, в гугле вычитал что нужно реализовать тот делегат явно, но перечитывать сотню страниц ради этого не захотелось(а зря), потому решил просто удалить тот обьект, ибо будучи закоментированной строка его создания, все работало на ура. Спасибо.

ps Евгений, не понял на какой здесь пример со шрифтами.

03.08.12
Посмотреть всех экспертов из раздела Технологии > .Net/C#
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store