Eu tenho o seguinte método de extensão:
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;
}
}
Apenas aplica uma ação a cada item da sequência antes de devolvê-lo.
Eu queria saber se eu deveria aplicar o Pure
atributo (das anotações do Resharper) a esse método, e posso ver argumentos a favor e contra.
Prós:
- estritamente falando, é puro; apenas chamá-lo em uma sequência não altera a sequência (retorna uma nova sequência) ou faz qualquer alteração de estado observável
- chamá-lo sem usar o resultado é claramente um erro, pois não tem efeito, a menos que a sequência seja enumerada, portanto, gostaria que o Resharper me avisasse se eu fizer isso.
Contras:
- mesmo que o
Apply
método em si seja puro, enumerar a sequência resultante fará alterações de estado observáveis (que é o ponto do método). Por exemplo,items.Apply(i => i.Count++)
alterará os valores dos itens toda vez que forem enumerados. Portanto, a aplicação do atributo Pure é provavelmente enganosa ...
O que você acha? Devo aplicar o atributo ou não?