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

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

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

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

call

и

callvirt

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

callvirt

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

NullReferenceException

в случае

null

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

callvirt

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

call null.Function

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

Test.exe

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

Test.Patched.exe

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

callvirt

на

call

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

NullReferenceException

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

call

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

null

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

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

textual
Листинг программы
  1. class Test
  2. {
  3.     int x;
  4.     public void Do()
  5.     {
  6.         try { x = 33; }
  7.         catch(NullReferenceException) { Console.WriteLine("NullReferenceException in \"x=33\""); }
  8.     }
  9.     static void Main()
  10.     {
  11.         ((Test)null).Do();
  12.     }
  13. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут