Ответ на 1,2 и 4 почти одинаков.Методы расширения - это просто статические методы с некоторым специальным синтаксическим сахаром.Это:
public static void DoIt(this string str) {
// ..
}
"test".DoIt();
Фактически тот же IL, что и:
public static void DoIt(string str) {
// ..
}
DoIt("test");
Хотя первый метод значительно упрощает предоставление поддержки IntelliSense.Ограничение класса, которое должно быть статичным, возможно, является просто решением проекта или может быть связано с производительностью.
Ответ на вопрос № 3 - это только синтаксис, который выбрали дизайнеры языка.C # разработчики привыкли this
ссылаться на объект экземпляра.Они могли бы назвать его blah
, но это не было бы так же очевидно, как и объект экземпляра.
Использование ключевого слова this в методе расширения также говорит компилятору C # пометить его как ExtensionAttribute .Этот атрибут используется потребителями сборки для поиска методов расширения.