我有以下扩展方法:
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;
}
}
它只是在返回序列之前对序列的每个项目执行操作。
我想知道是否应该将Pure
属性(来自Resharper注释)应用于此方法,并且可以看到支持和反对该参数的参数。
优点:
- 严格来说,它是纯净的;仅在序列上调用它不会更改序列(它返回新序列)或进行任何可观察的状态更改
- 在不使用结果的情况下调用它显然是一个错误,因为除非枚举序列,否则它没有任何作用,所以我希望Resharper在这样做时向我发出警告。
缺点:
- 即使
Apply
方法本身是纯方法,枚举结果序列也会使状态发生可观察的变化(这是方法的重点)。例如,items.Apply(i => i.Count++)
将在每次枚举时更改项目的值。因此,应用Pure属性可能会误导...
你怎么看?是否应该应用该属性?