Tengo el siguiente método de extensión:
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;
}
}
Simplemente aplica una acción a cada elemento de la secuencia antes de devolverlo.
Me preguntaba si debería aplicar el Pure
atributo (de las anotaciones de Resharper) a este método, y puedo ver argumentos a favor y en contra.
Pros:
- estrictamente hablando, es puro; simplemente llamarlo en una secuencia no altera la secuencia (devuelve una nueva secuencia) ni realiza ningún cambio de estado observable
- llamarlo sin usar el resultado es claramente un error, ya que no tiene ningún efecto a menos que se enumere la secuencia, por lo que me gustaría que Resharper me avise si hago eso.
Contras:
- a pesar de que el
Apply
método en sí es puro, enumerar la secuencia resultante hará cambios de estado observables (que es el punto del método). Por ejemplo,items.Apply(i => i.Count++)
cambiará los valores de los elementos cada vez que se enumeren. Entonces, aplicar el atributo Pure es probablemente engañoso ...
¿Qué piensas? ¿Debo aplicar el atributo o no?