Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Как происходит вызов сокрытого метода под капотом?

Я знаю, как происходит вызов виртуальных метод под капотом, но ни у Голдштейна, ни у Рихтера я не нашёл инфу о том, как происходит вызов сокрытого метода. Так как это всё-таки происходит? Help me please.
То есть как происходит вызов этого метода:
class A
{
 public void DoSmth()
 {

 }
}
class B : A
{
 public new void DoSmth()
 {

 }
}
class Program
{
 public static void Main()
 {
  A a = new B();
  a.DoSmth();
 }
}
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
а в книгах этого и не должно быть. вы сейчас спрашиваете про детали реализации, которые даже рамках .нета могут отличатся (.нет это же не только c#). Обычно за такими знаниями нужно лезть конкретно в кишки компилятора/рантайма. Но помните что знание нескольких принципов заменяет знание многих нюансов, и обычно понимания "как оно обычно устроено" хватает с головой.

и отвечая конкретно на этот вопрос - какой именно метод вызывать определяется в рантайме на основе информации в виртуальной таблице которая сотв. классу. И у рихтера точно есть упоминание об этом (что вызов виртуального метода несколько медленей т.к. приходится делать дополнительную проверку по виртуальной таблице чтоб понять что именно нужно вызывать).

В целом это происходит +- так:
1. для каждого класса создается виртуальная таблица а-ля [method_id address ...]

Class1:
0x001 0x0001 ...
0x002 0x0100 ...
...

Class2:
0x002 0x0F00 ...
...

2. когда вы делаете instanceOfMyClass.DoSomethingUsefull(...) CLR проверяет виртуальный таблицы (возможно пробегается по всей иерархии наследования, чтоб понять где точно лежит нужный метод) и дальше вызывает его передав в него адресс где в памяти лежит сам класс И список параметров с которыми вызывается метод.

^ могу ошибатся в нюансах, но принцип такой
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Если я правильно понял вопрос, то примерно так.
А в общем случае пользуйтесь документированными функциями и публичными методами.

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType, 
    BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(this, new object[] { methodParams });
Ответ написан
Ваш ответ на вопрос

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

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