Я знаю, что в C#, если написать ~MyClass()
, это в основном переводится как override System.Object.Finalize()
. Таким образом, вне зависимости от того, пишете вы деструктор или нет, каждый тип в CLR будет иметь Finalize()
метода (по крайней мере, из System.Object
).
1] Значит ли это, что каждый объект по умолчанию имеет финализатор?
2] На каком основании CLR решает, что объект должен быть помещен в очередь финализации?
Я спрашиваю об этом, потому что у меня был класс, скажем, ManagedResourceHolder
, который реализовал IDisposable
, но не вызывал GC.SuppressFinalize(this)
в своем методе IDisposable.Dispose()
. В классе не было неуправляемых ресурсов, и не было необходимости в методе ~ManagedResourceHolder()
, что, в свою очередь, означало отсутствие необходимости в вызове GC.SuppressFinalize(this)
, поскольку не было финализатора.
3] В контексте приведенного выше сценария всегда необходимо предоставлять финализатор при реализации IDisposable? (даже в классе, который не содержит неуправляемых ресурсов)
Правило FxCop CA1816 выдавало мне нарушение этого правила, и я получил здесь, когда Я спросил на форуме CA в MSDN, меня это смутило.
Спасибо.