Saya memiliki metode ekstensi berikut:
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;
}
}
Itu hanya berlaku tindakan untuk setiap item dari urutan sebelum mengembalikannya.
Saya bertanya-tanya apakah saya harus menerapkan Pure
atribut (dari anotasi Resharper) ke metode ini, dan saya bisa melihat argumen yang mendukung dan menentangnya.
Pro:
- tegasnya, itu adalah murni; hanya menyebutnya pada urutan tidak mengubah urutan (mengembalikan urutan baru) atau membuat perubahan keadaan yang dapat diamati
- memanggilnya tanpa menggunakan hasilnya jelas merupakan kesalahan, karena itu tidak berpengaruh kecuali urutannya disebutkan, jadi saya ingin Resharper memperingatkan saya jika saya melakukannya.
Cons:
- meskipun
Apply
metode itu sendiri murni, menyebutkan urutan yang dihasilkan akan membuat perubahan keadaan yang dapat diamati (yang merupakan titik metode). Misalnya,items.Apply(i => i.Count++)
akan mengubah nilai item setiap kali itu disebutkan. Jadi menerapkan atribut Pure mungkin menyesatkan ...
Bagaimana menurut anda? Haruskah saya menerapkan atribut atau tidak?