2015-10-26 2 views
1

Я хотел бы сделать DisposableHelper класс, который регистрирует информацию в случае, если объект был завершен (и не склонного)Статическое поле в C# финализаторе

public abstract class DisposableBase : IDisposable 
{ 
    static Log log = new Log(); 
    ... 

    ~DisposableBase() 
    { 
     log.Error("Object not disposed."); 
     Dispose(false); 
    } 
} 

log класс на основе log4net. Я хотел спросить, будет ли объект log доступен во время финализатора. Я предполагаю, что статическое поле будет мусором, собранным в конце процесса, но я не уверен. Я что-то пропустил?

+0

Да, 'static log log' не будет собран и будет доступен во время финализатора –

+0

Зачем вам нужен финализатор на первом месте? Если этот класс предназначен для базового класса для Disposables, для этого вам не нужен Finalizer. Финализатор имеет смысл только тогда, когда вы работаете с каким-то неуправляемым ресурсом. –

+0

Код, который я предоставил, не заполнен. Фактически это завернуто в '#if DEBUG', и его цель - найти места, где потребитель забывает распоряжаться каким-либо одноразовым объектом. – Ondra

ответ

2

Я думаю, что статическое поле будет мусор в конце процесса, но я не уверен,

Не совсем. Он будет иметь право на сборку мусора, когда AppDomain будет разветвлен. Для приложений с одним AppDomain, как правило, когда процесс завершается.

Обратите внимание, что я сказал права сбора мусора и не будет мусором. Потому что это depends on several reasons.

Это, как говорится, вы можете получить поле log, не беспокоясь. Статические поля доступны в финализаторе (хотя я бы избегал этого).