Где определяются операции для String, Int32 и т. Д.? - PullRequest
6 голосов
/ 29 января 2009

Я просматривал типы String и Int32 через отражатель, но не смог найти ни одного определенного оператора.

Если они не определены, как +/- и т. Д. Работают с этими типами?

Ответы [ 5 ]

10 голосов
/ 29 января 2009

Числовые операторы являются частью самого IL. Оператор «+» в строках немного особенный - он не перегружается самим строковым типом, он выполняется компилятором. Компилятор C # переводит:

string x = a + "hello" + b;

в

string x = string.Concat(a, "hello", b);

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

5 голосов
/ 29 января 2009

Класс String имеет только два, они имеют имена, совместимые с CLS: op_Equality и op_Inequality. Компилятор обладает множеством встроенных знаний о классе System.String. Необходим для того, чтобы иметь возможность использовать код операции Ldstr для одного. Аналогично, он переводит оператор + в String.Concat ().

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

2 голосов
/ 29 января 2009

Операторы для примитивов - это боль, как я обнаружил, когда пытался написать универсальную поддержку операторов (т.е. используя T + T и т. Д.); здесь также есть страница обсуждения , которая охватывает это .

Вы можете обойти эту проблему, используя такие абстракции, как Expression (.NET 3.5) - в противном случае вам придется взглянуть на raw IL или использовать несколько известных методов.

1 голос
/ 29 января 2009

Компилятор c # - сумасшедший сын b ... Я однажды пытался воссоздать способности типа Nullable и не смог, пока в некоторых комментариях в своем блоге Эрик Липперт не убедил меня, что его возможности также получены из того, что компилятор генерирует, когда он встречает обнуляемые типы.

1 голос
/ 29 января 2009

Да, эти операции переводятся в собственные инструкции IL, не вызывая метод «operator +» явным образом. Вероятно, это не управляемый код, выполняющий эти действия ...

...