В дополнение к другим ответам, методы расширения являются отличным способом добавить реализацию интерфейса в интерфейс. Например, если вы хотите, чтобы все списки были сортируемыми, добавьте метод расширения для IList<T>
.
Вы можете (как уже говорилось) также использовать методы расширения для добавления методов в классы вне вашего контроля; когда-нибудь хотел Reverse()
метод на string
? Добавьте один!
Единственное отличие состоит в том, что методы расширения не используют виртуальные и нет нулевой проверки. Вы можете использовать это в своих интересах, если вам нравится:
public static void ThrowIfNull<T>(this T obj, string name) where T : class
{
if(obj == null) throw new ArgumentNullException(name);
}
В отличие от обычных служебных методов, они позволяют очень легко создавать беглые интерфейсы; это одна из причин их существования - то есть с LINQ:
var foo = source.Where(predicate).OrderBy(selector);
намного удобочитаемее, чем:
var foo = Enumerable.OrderBy(Enumerable.Where(source,predicate),selector);
При использовании обычных методов, чтобы использовать первый подход, это должны быть обычные методы экземпляра, которые потребуют изменения (например) в IEnumerable<T>
- не желательно.