У меня есть следующий метод расширения:
public static IEnumerable<T> Apply<T>(
[NotNull] this IEnumerable<T> source,
[NotNull] Action<T> action)
where T : class
{
source.CheckArgumentNull("source");
action.CheckArgumentNull("action");
return source.ApplyIterator(action);
}
private static IEnumerable<T> ApplyIterator<T>(this IEnumerable<T> source, Action<T> action)
where T : class
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Он просто применяет действие к каждому элементу последовательности перед его возвратом.
Мне было интересно, должен ли я применить Pure
атрибут (из аннотаций Resharper) к этому методу, и я могу видеть аргументы за и против него.
Плюсы:
- строго говоря, является чистым; просто вызов его в последовательности не изменяет последовательность (она возвращает новую последовательность) или вносит какие-либо наблюдаемые изменения состояния
- вызывать его без использования результата явно ошибка, поскольку он не имеет никакого эффекта, если последовательность не перечислена, поэтому я бы хотел, чтобы Решарпер предупредил меня, если я это сделаю.
Минусы:
- даже если
Apply
сам метод чист, перечисление полученной последовательности будет сделать наблюдаемые изменения состояния (которая является точкой методы). Например,items.Apply(i => i.Count++)
будет изменять значения элементов при каждом перечислении. Так что применение атрибута Pure, вероятно, вводит в заблуждение ...
Что вы думаете? Должен ли я применить атрибут или нет?