.NET 4.x В чем разница между call и callvirt - C#

Узнай цену своей работы

Формулировка задачи:

Вопрос касательно IL кода программы. Вычитал у Рихтера, что разница между командами

call

и

callvirt

при применении к невиртуальному методу состоит в том, что

callvirt

проверяет объект, функция которого вызывается и кидает

NullReferenceException

в случае

null

. И, мол, поэтому

callvirt

работает чуть медленнее своего собрата. При этом, что происходит в случае

call null.Function

, осталось неизвестным. Посему, я решил немного отредактировать код после компиляции и посмотреть, что будет во втором случае. Итак, исходный С# код таков:
public class Test
{
    static void Main()
    {
        Object p = null;
        p.GetType();
    }
}
Полученный il код файла

Test.exe

: Немного модифицирую 5 команду (

Test.Patched.exe

): Консольный вывод при этом совпадает для обоих exe: Аналогично вывод совпадает если поставить catch в коде:
static void Main()
{
    Object p = null;
    try { p.GetType(); }
    catch(NullReferenceException) { Console.WriteLine("Exception..."); }
}
и заменить

callvirt

на

call

. Оба выводят Exception: Вопрос состоит в том, почему оба выбрасывают

NullReferenceException

. Или как ведет себя

call

при обращении к

null

. P.S. На stackoverflow во втором ответе такое же объяснение разницы между этими двумя командами.

Решение задачи: «.NET 4.x В чем разница между call и callvirt»

textual
Листинг программы
class Test
{
    int x;
    public void Do()
    {
        try { x = 33; }
        catch(NullReferenceException) { Console.WriteLine("NullReferenceException in \"x=33\""); }
    }
    static void Main()
    {
        ((Test)null).Do();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5