Страницы

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

вторник, 6 ноября 2018 г.

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

Товарищи, возник следующий вопрос: балуясь с рефлексией, можно из классов доставать методы, определяющие работу их операторов сложения, вычитания и прочих, зная специальные имена (вроде op_Addition). К примеру сей код:
DateTime test = (DateTime)typeof(DateTime).GetMethod("op_Addition").Invoke(null, new object[] { DateTime.Now, new TimeSpan(10) });
Работает аки часы. Однако подобный «трюк» не проходит с Int32, String и некоторыми другими классами. Такое чувство, будто для них и не определены таковые операторы, хотя мы знаем, что это не так Собственно, делая выжимку, мой вопрос таков: где упрятаны методы, определяющие операторы сложения и подобных для Int32, к примеру?


Ответ

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

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

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