Mengapa kata kunci hasil digunakan bersamaan dengan return and break, dan tidak dengan sendirinya?


11

Dalam C # Anda dapat membangun metode dengan tipe pengembalian IEnumerable<T>dan menggunakan yield returndan yield breakuntuk mengontrol aliran. Berikut adalah contoh sederhana yang menggunakan kedua kontrol:

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

Pertanyaan saya adalah, mengapa awalnya dirancang untuk menggunakan dua kata kunci dengan yielddan tidak menggunakannya seperti berikut ini dengan single yield"menghasilkan nilai kembali":

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

Bagi saya, ini lebih mudah dibaca dan dimengerti.

Jawaban:


13

yield returnSintaks yang sedikit canggung dibuat sehingga kode yang ada yang menggunakan kata "hasil" sebagai pengidentifikasi (nama variabel) tidak akan rusak . (Masuk akal, misalnya, untuk memiliki variabel bernama yieldjika Anda bekerja dengan kode keuangan.) Karena "imbal hasil" akan menjadi kesalahan sintaksis saat itu, sintaks baru tidak akan merusak kode yang ada.

Adapun yield break, tidak tahu. Tampaknya itu benar-benar tidak memiliki alasan kuat di baliknya yang dapat saya temukan.


Bukankah yield x;juga kesalahan sintaksis saat itu?
Moop

1
@ Mooop: Dengan membuatnya yield return, Anda bahkan tidak perlu repot memikirkan apakah itu kesalahan sintaks atau tidak. Peluang tabrakan menjadi nol.
Robert Harvey

2
Untuk "yield break;", pada dasarnya seperti "return;" dalam metode kosong, tetapi menggunakan "kembali;" dalam kombinasi dengan "hasil pengembalian;" bisa membingungkan. Jadi pilihan "yield break" adalah konsekuensi dari memilih "imbal hasil".
Cyanfish

3
@ Mooop jika Anda memiliki jenis bernama yieldmaka yield x;tidak akan menjadi kesalahan sintaks, tetapi deklarasi variabel yang valid.
Bojan Resnik

1
@moop: Lihat juga ericlippert.com/2009/05/11/reserved-and-contextual-keywords dan blogs.msdn.com/b/ericlippert/archive/2010/09/27/... jika subjek memperkenalkan kata kunci baru tanpa melanggar kepentingan kode apa pun Anda.
Eric Lippert
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.