ฉันมีวิธีการต่อไปนี้:
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 อาจทำให้เข้าใจผิด ...
คุณคิดอย่างไร? ฉันควรใช้คุณสมบัตินี้หรือไม่?