Так было много комментариев по поводу того, что метод расширения ForEach не подходит потому что он не возвращает значение, подобное методам расширения LINQ. Хотя это фактическое утверждение, это не совсем так.
Методы расширения LINQ делать все возвращают значение, так что они могут быть соединены друг с другом:
collection.Where(i => i.Name = "hello").Select(i => i.FullName);
Однако, только потому, что LINQ реализован с использованием методов расширения не означает, что методы расширения должны быть использованы в то же самое и вернуть значение. Написание метода расширения для раскрытия общей функциональности, которая не возвращает значение, является вполне допустимым использованием.
Удельная arguement о ForEach является то, что, на основе ограничений на методах расширения (а именно, что метод расширения не будет никогда переопределять наследуемый метод с же подписью), может возникнуть ситуация, когда пользовательские расширения метод доступен для всех классов, которые impelement IEnumerable <T
> кроме списка <T
>. Это может вызвать путаницу, когда методы начинают вести себя по-разному в зависимости от того, вызван ли метод расширения или метод наследования.
Хмм, хорошая точка. Единственное, что я могу думать об этом, это тот факт, что List <> также имеет метод ForEach. К сожалению, я не могу придумать пример, когда использование ForEach было бы полезно синтаксически. – 2008-09-19 12:07:52
Но что произойдет, если у вас уже есть делегат? :) – leppie 2008-09-19 12:08:11
leppie: вы вызываете делегата в foreach :) – Coincoin 2008-09-19 12:29:07