Шрифт:
Внутреннее представление перегруженных операций
Подобно любому элементу программы C#, перегруженные операции представляются специальными элементами синтаксиса CIL. Откройте, например, компоновочный блок OverloadedOps.exe с помощью ildasm.exe. Как показано на рис. 9.1, перегруженные операции внутри блока представляются скрытыми методами (это, например, op_Addition, oр_Subtraction, op_Equality и т.д.).
Теперь, если рассмотреть CIL-инструкции для метода op_Addition, то вы обнаружите, что csc.exe добавляет в метод ключевое слово specialname.
Рис. 9.1. В терминах CIL перегруженные операции отображаются в скрытые методы
Итак, любая операция, допускающая перегрузку, сводится в терминах CIL к специальному именованному методу. В табл. 9.2 раскрывается соответствие имен типичных операций C# и методов CIL.
Таблица 9.2. Соответствие имен операций C# и методов CIL
Внутренняя операция C# | Представление CIL |
---|---|
–- | op_Decrement |
++ | op_Increment |
+ | op_Addition |
– | op_Subtraction |
* | op_Multiply |
/ | op_Division |
== | op_Equality |
› | op_GreaterThan |
‹ | op_LessThan |
!= | op_Inequality |
›= | op_GreaterThanOrEqual |
‹= | op_LessThanOrEqual |
–= | op_SubtractionAssignment |
+= | op_AdditionAssignment |
Использование перегруженных операций в языках, не поддерживающих перегрузку операций
Понимание того, как перегруженные операции представлены в программном коде CIL интересно не только с академической точки зрения. Чтобы осознать практическую пользу этих знаний, вспомните о том, что возможность перегрузки операций поддерживается не всеми языками, предназначенными для .NET. Как, например, добавить пару типов Point в программу, созданную на языке, не поддерживающем перегрузку операций?
Одним из подходов является создание "нормальных" открытых членов, которые будут решать ту же задачу, что и перегруженные операции. Например, можно добавить в Point методы Add в Subtract, которые будут выполнять работу, соответствующую операциям + и -.
С такими модификациями тип Point способен демонстрировать соответствующие функциональные возможности, используя любые подходы, предлагаемые в рамках данного языка. Пользователи C# могут применять операции + и – или же вызывать Add/Subtract.