Реализация IDisposable на запечатанном классе

Если это попытка использовать одно действие GET для нескольких представлений, которые POST для нескольких действий с разными моделями, попробуйте добавить действие GET для каждого действия POST, которое перенаправляет на первый GET, чтобы предотвратить обновление 404.

Длинный снимок, но общий сценарий.

22
задан DavidRR 2 December 2015 в 18:32
поделиться

4 ответа

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

Нет, вы не должны объявлять виртуальный метод в классе sealed . Он вообще не компилировался. Кроме того, не рекомендуется объявлять новые защищенные члены в запечатанных классах.

14
ответ дан 28 November 2019 в 23:57
поделиться

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

Например:

 public void Dispose() { Dispose(true); }
 ~MemBlock() { Dispose(false); }
 void Dispose(bool disposing) { // would be protected virtual if not sealed 
     if(disposing) { // only run this logic when Dispose is called
         GC.SuppressFinalize(this);
         // and anything else that touches managed objects
     }
     if (ptr != IntPtr.Zero) {
          Marshal.FreeHGlobal(ptr);
          ptr = IntPtr.Zero;
     }
 }
10
ответ дан 28 November 2019 в 23:57
поделиться

Вы не можете объявить виртуальные методы в запечатанном классе. Также объявление защищенных членов в запечатанном классе дает вам предупреждение компилятора. Итак, вы реализовали это правильно. Вызов GC.SuppressFinalize (this) из финализатора не является необходимым по очевидным причинам, но он не может нанести вреда.

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

1
ответ дан 28 November 2019 в 23:57
поделиться

Из Журнал Джо Даффи :

Для закрытых классов этот шаблон требует не следовать, то есть вы должны просто реализуйте свой Finalizer и Утилизируйте с помощью простых методов (т.е. ~ T () (Завершить) и Dispose () в C #). При выборе последнего маршрута ваш код по-прежнему должен соответствовать нижеприведенные рекомендации относительно реализация доработки и логика утилизации.

Так что да, вы должны быть хорошими.

Вам действительно нужен финализатор, как упомянул Мердад. Если вы хотите избежать этого, вы можете взглянуть на SafeHandle . У меня недостаточно опыта работы с P / Invoke, чтобы предложить правильное использование.

8
ответ дан 28 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: