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 solo un'azione a ciascun elemento della sequenza prima di restituirlo.
Mi chiedevo se avrei dovuto applicare l' Pure
attributo (dalle annotazioni di Resharper) a questo metodo, e posso vedere gli argomenti a favore e contro di esso.
Professionisti:
- a rigor di termini, è puro; semplicemente chiamandolo su una sequenza non altera la sequenza (restituisce una nuova sequenza) o fa qualsiasi cambiamento di stato osservabile
- chiamarlo senza usare il risultato è chiaramente un errore, dal momento che non ha alcun effetto se non viene elencata la sequenza, quindi mi piacerebbe che Resharper mi avvertisse se lo facessi.
Contro:
- anche se il
Apply
metodo stesso è puro, l'enumerazione della sequenza risultante comporterà cambiamenti di stato osservabili (che è il punto del metodo). Ad esempio,items.Apply(i => i.Count++)
modificherà i valori degli elementi ogni volta che viene elencato. Quindi applicare l'attributo Pure è probabilmente fuorviante ...
Cosa ne pensi? Devo applicare l'attributo o no?