Чисто, удобство ... вы не знаете, какое состояние вам понадобится при определении, например, Predicate<T>
- рассмотрите:
List<int> data = new List<int> {1,2,3,4,5,6,7,8,9,10};
int min = int.Parse(Console.ReadLine()), max = int.Parse(Console.ReadLine());
List<int> filtered = data.FindAll(i => i >= min && i <= max);
здесь мы передали два дополнительных бита состояния в Predicate<T>
(min
и max
) - но мы не можем определить List<T>.FindAll(Predicate<T>)
, чтобы знать об этом, поскольку это деталь вызывающего абонента.
Альтернатива - писать сами классы, но это сложно, даже если мы ленивы:
class Finder {
public int min, max;
public bool CheckItem(int i) { return i >= min && i <= max;}
}
...
Finder finder = new Finder();
finder.min = int.Parse(Console.ReadLine());
finder.max = int.Parse(Console.ReadLine());
List<int> filtered = data.FindAll(finder.CheckItem);
Я не знаю о вас, но я предпочитаю версию с закрытием ... особенно, если учесть, насколько она сложна, когда у вас несколько контекстных уровней. Я хочу, чтобы компилятор беспокоился об этом.
Подумайте также, как часто вы используете такие конструкции, особенно для таких вещей, как LINQ: вам не хотелось бы делать это каким-либо другим способом ...