Ich habe die folgende Erweiterungsmethode:
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;
}
}
Es wird lediglich eine Aktion auf jedes Element der Sequenz angewendet, bevor es zurückgegeben wird.
Ich habe mich gefragt, ob ich das Pure
Attribut (aus Resharper-Annotationen) auf diese Methode anwenden soll , und ich kann Argumente dafür und dagegen sehen.
Vorteile:
- streng genommen, es ist rein; Wenn Sie es nur für eine Sequenz aufrufen, ändert sich weder die Sequenz (es wird eine neue Sequenz zurückgegeben) noch wird eine beobachtbare Statusänderung vorgenommen
- Das Aufrufen ohne Verwendung des Ergebnisses ist eindeutig ein Fehler, da es keine Auswirkung hat, wenn die Sequenz nicht aufgezählt wird. Daher möchte ich, dass Resharper mich warnt, wenn ich das tue.
Nachteile:
- obwohl die
Apply
Methode selbst rein ist, die resultierende Sequenz Aufzählen wird machen beobachtbaren Zustandsänderungen (das ist der Punkt des Verfahrens ist). Ändert beispielsweiseitems.Apply(i => i.Count++)
die Werte der Elemente jedes Mal, wenn sie aufgelistet werden. Das Anwenden des Pure-Attributs ist also wahrscheinlich irreführend ...
Was denkst du? Soll ich das Attribut anwenden oder nicht?