Задать вопрос
robinzonejob
@robinzonejob
разработчик .NET

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

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

Вопрос - почему она должна возникать? И из-за чего?
  • Вопрос задан
  • 760 просмотров
Подписаться 4 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Stepik
    Профессия "C# разработчик"
    1 неделя
    Далее
  • XYZ School
    C# для разработки игр
    5 месяцев
    Далее
  • Учебный центр IBS
    DEV-001_NET Шаблоны проектирования GoF. Редакция для .NET
    1 неделя
    Далее
Решения вопроса 1
virtual_hack2root
@virtual_hack2root
.NET Core, JS, DevOps
Ну, видимо, потому что сигнатура метода base.ToString() уже находится в таблице виртуальных функций, и он вызывал бы сам себя при обращении к этому методу, потому что в коде, который вызывает base.ToString(), уже очевидно, что сигнатура вызова совпадает с сигнатурой базового класса (переопределен метод ToString()), тогда, нашелся бы вызов метода дочернего класса callvirt, то есть собственно, исполняемый перегуженный в дочернем классе метод, и он вызвал бы сам себя, вместо простого вызова call без поиска по таблице сигнатур виртуальных методов (переопределяемых).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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