Ho il seguente metodo di estensione:
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;
}
}
Applica semplicemente un'azione a ciascun elemento della sequenza prima di restituirla.
Mi chiedevo se avrei dovuto applicare l'attributo Pure
(dalle annotazioni di Resharper) a questo metodo, e posso vedere gli argomenti a favore e contro di esso.
Pro:
- in senso stretto, è puro; semplicemente chiamandolo su una sequenza non altera la sequenza (restituisce una nuova sequenza) o modifica qualsiasi stato osservabile
- chiamarlo senza usare il risultato è chiaramente un errore, dal momento che non ha alcun effetto a meno che la sequenza non sia enumerata, quindi vorrei che Resharper mi avvisi se lo faccio.
Contro:
- anche se il metodo
Apply
è puro, enumerando la sequenza risultante renderà le modifiche dello stato osservabili (che è il punto del metodo). Ad esempio,items.Apply(i => i.Count++)
cambierà i valori degli elementi ogni volta che viene enumerato. Quindi applicare l'attributo Pure è probabilmente fuorviante ...
Che ne pensi? Devo applicare l'attributo o no?