В последнее время я проводил рефакторинг старого кода, и многие методы полезны в качестве методов расширения для базовых типов, таких как double
, float
, int
, string
и т. Д. -проверка, делая большие успехи, мысль пришла мне в голову. Есть несколько способов доступа к методу расширения. Давайте создадим контейнерный класс с именем Extensions
и добавим базовый метод расширения (сначала), а также фиктивный класс, который мы назовем Dummy
с помощью простого метода, который использует наш метод расширения с именем DoIt
.
public static class Extensions {
public static double ToRadians(this double degrees) => degrees * Math.PI / 180.0;
}
public class Dummy {
public void DoIt() {
double radians = Extensions.ToRadians(45.0);
double degrees = 90.0;
radians = degrees.ToRadians();
}
}
Не самый элегантный пример, но он демонстрирует широко известный доступ к методам расширения. Теперь давайте создадим идиотское и бессмысленное расширение под названием WasteOfTime
для нашего класса Dummy
, но внутри класса Extensions
.
Я не уверен, почему вы это сделаете, но ради вопроса, давайте сделаем это!
public static class Extensions {
...
public static void WasteOfTime(this Dummy dummy) { }
...
}
Хорошо, теперь у нас есть этот прекрасный маленький метод, который должен был быть помещен в класс Dummy
. Итак, поскольку методы расширения работают с экземплярами типов, вы должны иметь возможность вызывать WasteOfTime
из специального метода Dummy
class ', называемого DoIt
.
public void DoIt() {
...
WasteOfTime();
...
}
О, но подождите, вы не можете этого сделать! Метод не может быть найден! Давайте уточним это по ключевому слову this
!
this.WasteOfTime();
Это лучше, он компилируется! Оно работает! Это пустая трата времени! Круто!
Важное примечание
Я бы НЕ подумал бы сделать это на самом деле, но из любопытства я попробовал. Если вы можете привести веский пример того, почему это может быть хорошей идеей, не стесняйтесь поделиться, но я считаю, что это один из них; о чем вы думали типы реализаций.
Вопрос
Почему я должен был квалифицировать метод расширения, поскольку современные компиляторы устраняют необходимость в квалификационных полях, свойствах и методах с ключевым словом this
?
Единственное, о чем я могу думать, это то, что метод расширения технически статичен по отношению к базовому классу.