Mam następującą metodę rozszerzenia:
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;
}
}
Po prostu stosuje akcję do każdego elementu sekwencji przed jej zwróceniem.
Zastanawiałem się, czy powinienem zastosować Pure
atrybut (z adnotacji Resharper) do tej metody i widzę argumenty za i przeciw.
Plusy:
- ściśle mówiąc, jest czysty; samo wywołanie go w sekwencji nie zmienia sekwencji (zwraca nową sekwencję) ani nie powoduje zmiany obserwowalnego stanu
- wywołanie go bez użycia wyniku jest oczywiście błędem, ponieważ nie ma żadnego efektu, chyba że sekwencja jest wymieniona, dlatego chciałbym, aby Resharper mnie ostrzegł, jeśli to zrobię.
Cons:
- nawet jeśli
Apply
sama metoda jest czysta, wyliczenie wynikowej sekwencji spowoduje obserwowalne zmiany stanu (co jest celem metody). Na przykładitems.Apply(i => i.Count++)
zmieni wartości elementów za każdym razem, gdy są wyliczane. Zatem zastosowanie atrybutu Pure prawdopodobnie wprowadza w błąd ...
Co myślisz? Czy powinienem zastosować ten atrybut, czy nie?