2009-04-12 14 views
6

Tôi muốn biết mọi thứ về tuyên bố yield, dưới dạng dễ hiểu.thực hiện tuyên bố lợi nhuận

Tôi đã đọc về tuyên bố yield và sự dễ dàng của nó khi triển khai mẫu lặp. Tuy nhiên, hầu hết nó rất khô. Tôi muốn nhận được dưới bao gồm và xem cách Microsoft xử lý lợi nhuận trở lại.

Ngoài ra, khi nào bạn sử dụng ngắt năng suất?

+1

Bạn không nhận được cả "mọi thứ" và "dễ hiểu", xin lỗi! FYI, tôi sẽ đăng một loạt các bài viết trên blog về một số suy nghĩ về tính năng này từ một quan điểm thiết kế và triển khai ngôn ngữ bắt đầu từ ngày 2 tháng 7. –

Trả lời

10

yield hoạt động bằng cách xây dựng một máy trạng thái nội bộ. Nó lưu trữ trạng thái hiện tại của thường trình khi nó thoát ra và tiếp tục từ trạng thái đó vào lần sau.

Bạn có thể sử dụng Trình phản xạ để xem cách trình biên dịch thực hiện.

yield break được sử dụng khi bạn muốn ngừng trả lại kết quả. Nếu bạn không có một yield break, trình biên dịch sẽ giả định một ở cuối của hàm (giống như một tuyên bố return; trong một chức năng bình thường)

+0

"trạng thái hiện tại của thông lệ" nghĩa là gì: giá trị đăng ký bộ xử lý, con trỏ khung, v.v ...? – Guillaume07

+0

hãy xem [coroutines] (http://storm-enroute.com/coroutines/docs/0.6/101/) – Tcraft

+0

@Thủ thuật kinh điển của Microsoft không sử dụng các ngăn xếp khác nhau/ngăn xếp phân đoạn/v.v. Họ sử dụng một đối tượng phân bổ heap để lưu trữ trạng thái. –

5

Như Mehrdad nói, nó tạo nên một st ăn máy.

Cũng như sử dụng Reflector (một đề xuất tuyệt vời khác) bạn có thể tìm thấy my article on iterator block implementation hữu ích. Nó sẽ là tương đối đơn giản nếu nó không dành cho các khối finally - nhưng chúng giới thiệu một chiều hướng tổng thể bổ sung về sự phức tạp!