неправильно использовать деконструктор? - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть несколько файлов, записанных во временную папку в c #.Затем они отображаются в виде миниатюр в формате PDF.Когда объект уничтожен, я хочу очистить местоположение, так что в этом случае нормально использовать деконструктор?

    ~Foo()
    {
        try
        {
            Directory.Delete(path, true);
        }
        catch (IOException ex)
        {
            Console.WriteLine("exception: " + ex.Message + " . from: Foo_Closing");
        }

Ответы [ 8 ]

7 голосов
/ 07 апреля 2011

Даже если он имеет тот же синтаксис, что и деструктор C ++, это финализатор в C #, который запускается, когда объект подвергается сборке мусора при финализации - это будет влиять на производительность, поскольку GC должен запускать отдельныйпоток, чтобы запустить все финализаторы, чтобы сделать это, ваш экземпляр объекта будет жить дольше, чем необходимый.

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

3 голосов
/ 07 апреля 2011

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

Вы также можете вызвать Dispose из деструктора в случаеон не был вызван явно.См. эту страницу для рекомендуемого шаблона.

3 голосов
/ 07 апреля 2011

Вы должны реализовать интерфейс IDisposable и выполнить там очистку.

2 голосов
/ 07 апреля 2011

Реализация интерфейса IDisposable istead:

public class tester : IDisposable
{
    #region IDisposable Members

    public void Dispose()
    {
        //cleanup code here
    }

    #endregion
}

using (tester t = new tester())
{

}
//tester now disposed 

Но не забудьте это сокровище знаний от MSDN :

Поскольку метод Dispose должен быть явно, объекты, которые реализовать IDisposable должны также реализовать финализатор для обработки освобождение ресурсов при утилизации называется

Итак, вы должны также реализовать свой финализатор и интерфейс IDisposable, имея в виду, что оба они будут вызваны.

2 голосов
/ 07 апреля 2011

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

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

2 голосов
/ 07 апреля 2011

Я бы, вероятно, просто использовал временные местоположения файлов / папок среды, чтобы файлы могли быть очищены пользователем или администратором как часть обычного процесса обслуживания.

Не беспокойтесь об этом, потому что это похоже на хак - действительно ли так важно, чтобы папки тут же удалялись?

1 голос
/ 07 апреля 2011

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

public class Foo : IDisposable { public void Dispose() { //Clean up here}
}

using (foo = new Foo() ) { //consume foo here }

0 голосов
/ 07 апреля 2011

Существует возможность удалить временные файлы при закрытии, если вы можете использовать, что это не имеет значения, верно? Попробуйте эти ссылки

  1. Обработка с временным потоком файлов
  2. http://msdn.microsoft.com/en-us/library/system.io.fileoptions.aspx
  3. http://www.codeproject.com/KB/system/Taking_care_of_temp_files.aspx?msg=3489384
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...