Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Каким образом определены операторы у System.Int32 и прочих?

#c_sharp #рефлексия


Товарищи, возник следующий вопрос: балуясь с рефлексией, можно из классов доставать
методы, определяющие работу их операторов сложения, вычитания и прочих, зная специальные
имена (вроде op_Addition). 
К примеру сей код:

DateTime test = (DateTime)typeof(DateTime).GetMethod("op_Addition").Invoke(null,
new object[] { DateTime.Now, new TimeSpan(10) });


Работает аки часы. Однако подобный «трюк» не проходит с Int32, String и некоторыми
другими классами. Такое чувство, будто для них и не определены таковые операторы, хотя
мы знаем, что это не так
Собственно, делая выжимку, мой вопрос таков: где упрятаны методы, определяющие операторы
сложения и подобных для Int32, к примеру?
    


Ответы

Ответ 1



Они нигде не спрятаны, таких методов попросту нет. Когда компилятор обрабатывает оператор сложения для Int32, он просто генерирует add инструкцию в IL коде. Это сделано в целях производительности. Аналогично со всеми базовыми типами, которые умеет обрабатывать процессор напрямую: Int64, float, double. Исключение из этого правила - тип string. Когда компилятор встречает оператор + для строк, он генерирует вызов статического метода Concat(string, string).

Комментариев нет:

Отправить комментарий