2010-04-23 35 views
22

Tôi có hiểu biết mơ hồ về từ khóa yield trong , nhưng tôi chưa thấy cần sử dụng nó trong mã của mình. Điều này có thể xuất phát từ sự thiếu hiểu biết về nó.Sử dụng lợi nhuận ở C#

Vì vậy, một số cách sử dụng điển hình tốt của yield là gì?

+3

Hãy thử điều này đầu tiên: http://stackoverflow.com/search?q= lợi nhuận + c% 23, trang đầu tiên của kết quả có ít nhất 5 câu hỏi sẽ giúp bạn. – Benjol

+0

Ồ, cảm ơn! Rất nhiều thứ hữu ích ở đó! – Steve

+0

có thể trùng lặp của http://stackoverflow.com/questions/39476/what-is-the-yield-keyword-used-for-in-c –

Trả lời

14

yield chỉ giúp việc thực hiện điều tra viên rất đơn giản. Vì vậy, nếu bạn muốn viết một phương thức trả về một IEnumerable<T> nó giúp bạn tiết kiệm được việc tạo lớp liệt kê - bạn chỉ cần yield một kết quả tại một thời điểm và trình biên dịch sẽ xử lý các chi tiết bên dưới nắp.

Một trường hợp tiện dụng là viết "điều tra vô hạn" mà người gọi có thể gọi bao nhiêu lần tùy theo nhu cầu. Dưới đây là ví dụ tạo ra một chuỗi số Fibonacci vô hạn: http://chrisfulstow.com/fibonacci-numbers-iterator-with-csharp-yield-statements/ (tốt ... về mặt lý thuyết vô hạn, nhưng trong thực tế giới hạn kích thước của UInt64).

4

Lợi nhuận thực hiện mẫu tải chậm. Tôi đề nghị xem xét tính hữu ích của nó từ quan điểm này.

Ví dụ: trong bối cảnh của phần mềm kinh doanh tôi đang làm việc, nó có thể mang lại lợi thế của việc giảm tải trên cơ sở dữ liệu. Bạn viết mã để kéo một loạt dữ liệu từ cơ sở dữ liệu, nhưng chỉ phần đó sẽ được tải mà thực sự cần thiết cho một kịch bản cụ thể. Nếu người dùng không đi sâu hơn trong giao diện người dùng, dữ liệu tương ứng sẽ không được tải.

+0

Đó là một ví dụ thực sự hữu ích cho thấy rằng bạn có một danh sách dài có thể không được sử dụng đầy đủ. – maulik13

4

Lợi nhuận được sử dụng trong các điều tra viên. Trình biên dịch C# tự động tạm dừng thực hiện vòng lặp liệt kê của bạn và trả về giá trị hiện tại cho người gọi.

IEnumerable<int> GetIntegers(int max) { 
    for(int i = 1; i <= max) { 
     yield return i; // Return current value to the caller 
    } 
} 

- hoặc (clunky hơn) -

IEnumerable<int> GetIntegers(int max) { 
    int count = 0; 
    while(true) { 
     if(count >= max) yield break; // Terminate enumeration 

     count++; 
     yield return count; // Return current value to the caller 
    } 
} 

tin chi tiết về MSDN.

3

Cũng khá tốt trong thử nghiệm và chế giễu khi bạn chỉ muốn thử nghiệm một IEnumerable <> một cách nhanh chóng, một cái gì đó giống như ...

yield return somevalue; 
yield return someothervalue; 
yield return yetanotherone; 
Các vấn đề liên quan