Tại sao từ khóa năng suất được sử dụng cùng với trả lại và phá vỡ, mà không phải là chính nó?


11

Trong C #, bạn có thể xây dựng các phương thức với kiểu trả về IEnumerable<T>và sử dụng yield returnyield breakđể điều khiển luồng. Đây là một ví dụ đơn giản sử dụng cả hai điều khiển:

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        yield break;

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield return i;
    }        
}

Câu hỏi của tôi là, tại sao ban đầu nó được thiết kế để sử dụng hai từ khóa yieldvà không sử dụng nó như sau với yield"giá trị trả về" duy nhất :

public IEnumerable<int> GetEvens(int start, int end) {
    if(end < start)
        return; // stop completely and return nothing

    if(start & 2 != 0)
        start++;

    for(int i = start; i <= end; i+=2) {
        yield i; // yield the current value.
    }        
}

Đối với tôi, điều này là đơn giản để đọc và hiểu.

Câu trả lời:


13

yield returnCú pháp hơi khó xử đã được tạo để mã hiện có sử dụng từ "suất" làm định danh (tên biến) sẽ không bị phá vỡ . (Nó làm cho cảm giác hoàn hảo, ví dụ, để có một biến tên là yieldnếu bạn đang làm việc với mã tài chính.) Kể từ khi "yield return" sẽ là một lỗi cú pháp trở lại sau đó, cú pháp mới sẽ không phá vỡ bất kỳ mã hiện.

Đối với yield break, không có ý tưởng. Điều đó thực sự dường như không có bất kỳ lý do chính đáng nào đằng sau nó mà tôi có thể tìm thấy.


Sau đó yield x;cũng không phải là một lỗi cú pháp?
Moop

1
@Moop: Bằng cách tạo ra nó yield return, bạn thậm chí không phải bận tâm suy nghĩ liệu đó có phải là lỗi cú pháp hay không. Cơ hội va chạm trở thành số không.
Robert Harvey

2
Đối với "phá vỡ năng suất;", về cơ bản nó giống như "lợi nhuận;" trong một phương thức void, nhưng sử dụng "return;" kết hợp với "lợi nhuận;" có thể gây nhầm lẫn. Vì vậy, việc lựa chọn "phá vỡ lợi nhuận" là kết quả của việc chọn "lợi nhuận".
Cyanfish

3
@Moop nếu bạn có một loại được đặt tên yieldthì đó yield x;sẽ không phải là lỗi cú pháp, mà là một khai báo biến hợp lệ.
Bojan Resnik

1
@moop: Xem thêm ericlippert.com/2009/05/11/reserved-and-contextual-keywordsblogs.msdn.com/b/ericlippert/archive/2010/09/27/... nếu chủ đề của giới thiệu từ khóa mới mà không phá vỡ bất kỳ mã nào làm bạn quan tâm.
Eric Lippert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.