Có sự khác biệt có liên quan.
Việc thực hiện GetByReYielding() sẽ được thực thi theo cách trì hoãn (vì nó là khối lặp). Nếu bạn đã sử dụng một tham số trong GetByReturn() hoặc GetByReYielding() và kiểm tra tham số đó trong thời gian chạy cho nullity (hoặc đã thực hiện bất kỳ xác thực nào khác), kiểm tra này sẽ được thực hiện ngay lập tức khi GetByReturn() được gọi nhưng không ngay lập tức khi GetByReYielding() được gọi ! Việc xác nhận trong GetByReYielding() sẽ được thực hiện theo cách trì hoãn, khi kết quả được lặp lại. - Đây thường là, "quá muộn". Xem tại đây:
// Checks parameters early. - Fine. The passed argument will be checked directly when
// GetByReturn() is called.
IEnumerable<int> GetByReturn(IEnumerable<int> sequence)
{
if(null == sequence)
{
throw new ArgumentNullException("sequence");
}
return GetIterator();
}
// Checks parameters in a deferred manner. - Possibly not desired, it's "too" late. I.e. // when the
// result is iterated somewhere in a completely different location in your code the
// argument passed once will be checked.
IEnumerable<int> GetByReYielding(IEnumerable<int> sequence)
{
if(null == sequence)
{
throw new ArgumentNullException("sequence");
}
for(var item in GetIterator())
{
yield return item;
}
}
Ông Skeet giải thích khái niệm này trong http://msmvps.com/blogs/jon_skeet/archive/2010/09/03/reimplementing-linq-to-objects-part-2-quot-where-quot.aspx. Các toán tử truy vấn chuẩn được cung cấp trong .Net sử dụng các hàm wrapper không hoãn (ví dụ: Where()) kiểm tra các tham số và sau đó gọi hàm lặp lõi (như tôi đã trình bày trong triển khai GetByReturn()).
Tôi hy vọng điều này sẽ hữu ích.
Lợi thế của việc tái sinh là gì? Nếu bạn muốn thực hiện một số hành động trên các mục, bạn sẽ không nhận được vòng lặp, phải không? Nếu không, tại sao không sử dụng phiên bản mã ngắn hơn? –
Tôi kết luận từ các thí nghiệm của tôi (và kiểm tra IL), rằng việc thực hiện GetByReYielding() sẽ bị trì hoãn (độc lập với cách GetIterator() hoạt động), nhưng việc thực hiện GetByReturn() thì không. Đó là tất cả. – Nico