robinzonejob
@robinzonejob
разработчик .NET

Что имеет в виду Рихтер (CLR Via C#) в 6-ой главе?

Помогите разобраться, что имеется в виду.
В 6-ой главе про вызов виртуальных методов, свойств - Рихтер пишет, что компилятор использует два метода:
call и callvirt .
Последний отличается тем, что у него есть проверка на null экземпляра, на котором он вызывается. Так же callvirt используется в том числе и для вызова обычных, экземплярных, невиртуальных методов.
А дальше - он пишет - что иногда, компилятор может использовать метод call для вызова виртуальных(!) методов и в качестве примера он приводит вызов base.ToString(). Объясняет он это тем, что если бы при вызове данного метода использовался callvirt то возникала бы рекурсия и переполнение стека.

Вопрос - почему она должна возникать? И из-за чего?
  • Вопрос задан
  • 606 просмотров
Решения вопроса 1
virtual_hack2root
@virtual_hack2root
.NET Core, JS, DevOps
Ну, видимо, потому что сигнатура метода base.ToString() уже находится в таблице виртуальных функций, и он вызывал бы сам себя при обращении к этому методу, потому что в коде, который вызывает base.ToString(), уже очевидно, что сигнатура вызова совпадает с сигнатурой базового класса (переопределен метод ToString()), тогда, нашелся бы вызов метода дочернего класса callvirt, то есть собственно, исполняемый перегуженный в дочернем классе метод, и он вызвал бы сам себя, вместо простого вызова call без поиска по таблице сигнатур виртуальных методов (переопределяемых).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы