Эрик Липперт написал об этом в блоге, и я подозреваю, что не могу сделать намного лучше, чем процитировать его:
Итак, да, часто звучащая критика
«методы расширения не
объектно-ориентированный "совершенно правильно,
но также довольно не имеет значения. расширение
методы конечно не
объектно-ориентированный. Они ставят код
который манипулирует данными далеко
из кода, который объявляет данные,
они не могут нарушить инкапсуляцию и
поговорить с частным государством
объекты, на которых они кажутся методами,
они плохо играют с
наследование и тд. Они
процедурное программирование в удобной
объектно-ориентированное платье.
Они также невероятно удобны и
сделать возможным LINQ, поэтому мы
добавил их. Тот факт, что они не
соответствовать некоторому философскому идеалу
что делает объектно-ориентированный язык
не был на самом деле большой фактор в
это решение.
Я бы добавил, однако, что они полезны не только для LINQ - по той же причине, что они полезны в LINQ. Очень приятно иметь возможность выражать алгоритмы, которые работают на произвольных реализациях определенного интерфейса (например, IEnumerable<T>
в LINQ to Obhects). Такие алгоритмы обычно не имеют никакого контекста, кроме интерфейсов, над которыми вы работаете, поэтому они часто являются статичными.
Если вы согласны, что у вас есть какой-то статический служебный метод, какой синтаксис вы бы предпочли использовать?
// Traditional
CollectionUtils.Sort(collection);
// Extension methods
collection.Sort();
Последний, на мой взгляд, просто более читабелен. Он кратко выражает то, что вы хотите сделать. не ясно, как вы хотите это сделать, но это менее важно для для большинства времени - и, конечно, более важно, когда вы отлаживаете эту конкретную строку .