ทำไมคำหลักที่ให้ผลตอบแทนถูกนำมาใช้ร่วมกับผลตอบแทนและการทำลายไม่ใช่ด้วยตัวเอง?


11

ใน C # คุณสามารถสร้างวิธีการที่มีประเภทผลตอบแทนIEnumerable<T>และการใช้yield returnและyield breakเพื่อควบคุมการไหล นี่คือตัวอย่างง่ายๆที่ใช้ตัวควบคุมทั้งสอง:

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;
    }        
}

คำถามของฉันคือทำไมมันถูกออกแบบมาเพื่อใช้คำหลักสองคำด้วยกันyieldและไม่ได้ใช้มันเหมือนดังต่อไปนี้ด้วยคำเดียวyield"ที่ให้ค่าตอบแทน":

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.
    }        
}

สำหรับฉันแล้วการอ่านและทำความเข้าใจง่ายกว่า

คำตอบ:


13

อึดอัดเล็กน้อยyield returnไวยากรณ์ที่ถูกสร้างขึ้นเพื่อให้รหัสที่ใช้คำว่า "ผลตอบแทน" เป็นตัวระบุ (ชื่อตัวแปร) ที่มีอยู่จะไม่ทำลาย (มันสมเหตุสมผลดีเช่นมีตัวแปรตั้งชื่อว่าyieldคุณกำลังทำงานกับรหัสทางการเงิน) เนื่องจาก "return return" จะเป็นข้อผิดพลาดทางไวยากรณ์ในตอนนั้นไวยากรณ์ใหม่จะไม่ทำลายโค้ดที่มีอยู่

สำหรับyield breakไม่มีความคิด ดูเหมือนจะไม่มีเหตุผลที่ดีที่ฉันสามารถหาได้


จะไม่yield x;เป็นข้อผิดพลาดทางไวยากรณ์หรือไม่
Moop

1
@Moop: โดยการทำให้yield returnคุณไม่ต้องกังวลเกี่ยวกับว่ามันเป็นข้อผิดพลาดทางไวยากรณ์หรือไม่ โอกาสของการชนจะกลายเป็นศูนย์
Robert Harvey

2
สำหรับ "ตัวแบ่งผลตอบแทน" เป็นหลักเช่น "return;" ในวิธีการโมฆะ แต่ใช้ "return;" ร่วมกับ "ผลตอบแทนผลตอบแทน" อาจสร้างความสับสน ดังนั้นตัวเลือกของ "ตัวแบ่งผลตอบแทน" เป็นผลมาจากการเลือก "ผลตอบแทนผลตอบแทน"
Cyanfish

3
@Moop หากคุณมีชื่อประเภทyieldนั้นyield x;จะไม่เป็นข้อผิดพลาดทางไวยากรณ์ แต่เป็นการประกาศตัวแปรที่ถูกต้อง
Bojan Resnik

1
@moop: ดูเพิ่มเติมที่ericlippert.com/2009/05/11/reserved-and-contextual-keywordsและblogs.msdn.com/b/ericlippert/archive/2010/09/27/ …หากหัวเรื่องของการแนะนำคำหลักใหม่โดยไม่มี ทำลายรหัสใด ๆ ที่คุณสนใจ
Eric Lippert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.