Как CLR разрешает метод, включающий динамический тип? - PullRequest
3 голосов
/ 16 января 2012

Учитывая,

Перегрузка метода = разрешение во время компиляции.

Переопределение метода = разрешение во время выполнения.

Как CLR разрешает следующий вызов метода (включая динамическийтип)?

    dynamic intValue = -10;
    var result = Math.Abs(intValue);

Спасибо за проявленный интерес.

Ответы [ 2 ]

1 голос
/ 16 января 2012

Процесс соединения имен с тем, что они есть, называется привязкой . Нормальным разрешением перегрузки является «раннее» связывание, поскольку точное значение имени метода определяется рано - во время компиляции.

Когда компилятор встречает виртуальный метод во время разрешения перегрузки, он генерирует виртуальный вызов. Во время выполнения это перенаправляется на правильный метод, возможно на переопределение.

Когда компилятор встречает динамический объект, он генерирует код для выполнения «позднего» связывания, то есть во время выполнения. Позднее связывание похоже на разрешение перегрузки во время выполнения. Код просматривает аргумент, находит его целое число, ищет правильную перегрузку для вызова и вызывает его.

Ну, это действительно немного больше, чем это. Он кэширует результат поиска и помещает тест, чтобы при следующем запуске кода он мог перейти к правильному вызову правильного метода, если тип аргумента int.

Это все еще упрощение. В действительности, можно добиться еще нескольких оптимизаций для достижения оптимальной производительности.

См. в этом блоге для более подробного объяснения того, что именно произойдет с вашим примером.

0 голосов
/ 16 января 2012

Привязка метода, которая включает параметры динамического типа, немного сложна в C #. Первое и основное правило, используемое компилятором: типы имеют приоритет перед динамическими. например:

 
    void method(dynamic x, string y)
    {
        //do something 
    }<br>
    void method(int x, string y)
    {
        // do something 
    }
вызов метода с аргументами int и строкой method(5,"some string) будет разрешен для второй функции. Однако, если параметры любого из методов были оба динамическими, компилятор жаловался бы на неоднозначный вызов метода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...