Завершить метод в классе System.Object - PullRequest
3 голосов
/ 23 января 2010

Из любопытства я разобрал mscorlib.dll, чтобы проверить реализацию класса System.Object.

Я нашел в этом что-то странное.

1).    
public class Object {
...
    protected override void Finalize(){}
...
}

Почему базовый класс имеетпереопределенный метод в нем?

2) public class Employee {
            public void InstanceMethod() {
                this.Finalize();
                //Does not compile, can i not access protected methods of base class??
            }
        }

Мне просто интересно, как используется метод «защищенного завершения» в классе Object и почему он получил специальную обработку компилятором?

Ответы [ 3 ]

4 голосов
/ 23 января 2010

Это ошибка в Reflector, она путается с виртуальным методом, который не имеет атрибута "newslot" и не имеет типа базового класса. Это может быть легче увидеть, когда вы переключаете декомпилятор на IL.

Реальная декларация финализатора, скопированная из ссылочного источника, примерно равна ожидаемой:

// Allow an object to free resources before the object is reclaimed by the GC.
//
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
~Object()
{
}
1 голос
/ 23 января 2010

Для второго вопроса, C # ~MyClass записывается в VB.NET как Protected Overrides Sub Finalize(), что эквивалентно protected override Finalize(). Так что это просто синтаксическая разница в C #.

По первому вопросу, в Reflector это

.method family hidebysig virtual instance void Finalize() cil managed

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

0 голосов
/ 23 января 2010

Проверьте MSDN для Object.Finalize :

Деструкторы - это механизм C # для выполнения операций очистки. Деструкторы предоставляют соответствующие меры безопасности, такие как автоматический вызов деструктора базового типа. В коде C # Object.Finalize не может быть вызван или переопределен.

Поэтому ответом на ваш вопрос будет: Ну, это часть внутренних органов CLR; компилятор C # выполняет всю работу, требуемую при написании, например:

public class Employee
{
   //Finalizer, also known as "destructor"
   ~Employee()
   {

   }
}
...