Я думаю, что я знаю ответ для класса, просто хочу подтвердить, что мое понимание верно. Допустим, у меня есть ClassA
и его экземпляр с именем a
. Когда a.MethodA()
вызывается:
(1) CLR находит тип ClassA
по указателю типа из a
в куче (тип загружен в кучу)
(2) Найдите MethodA
в типе, если он не найден, перейдите к его базовому типу, пока не появится класс object
.
Может быть, мое понимание не совсем точное, но я думаю, что оно в основном правильно (поправьте меня, если оно ошибочно!). И тут встает вопрос о простой struct .
struct MyStruct
{
public void MethodA() { }
}
У меня есть var x = new MyStruct();
, его значение находится в стеке, а тип MyStruct
загружен в кучу. При выполнении x.MethodA()
, конечно, нет бокса. Как CLR найти MethodA
, получить IL и выполнить / JIT? Я думаю, что ответ, вероятно: (снова, поправьте меня, если я не прав)
(1) у нас есть тип объявления из x
в стеке. CLR находит его тип по информации в стеке и находит MethodA
в своем типе. - давайте назовем это assumptionA
.
Я буду счастлив, если вы скажете мне, что мой assumptionA
правильный. Но даже если это неправильно, это говорит правду: у CLR есть способ найти тип структуры без бокса.
А как насчет x.ToString()
или x.GetType()
? Мы знаем, что значение будет упаковано, и тогда оно будет работать как класс. Но зачем нам здесь бокс? Так как мы можем получить его тип (предположение A говорит нам), почему бы не перейти к его базовому типу и найти метод (как класс)? Зачем здесь дорогая коробка операций?