Ürün anahtar kelimesi neden tek başına değil, geri dönüş ve kesme ile birlikte kullanılıyor?


11

C # size dönüş türü ile yöntemlerini inşa edebilir IEnumerable<T>ve kullanım yield returnve yield breakakışını kontrol etmek. Her iki denetimi de kullanan basit bir örnek:

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

Benim sorum, neden başlangıçta iki anahtar kelime yieldkullanmak ve tek yield"dönüş değeri veren" ile aşağıdaki gibi kullanmak için tasarlandı :

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

Benim için bu okumak ve anlamak daha basit.

Yanıtlar:


13

Biraz garip yield returnsözdizimi, tanımlayıcı (değişken adı) olarak "verim" kelimesini kullanan mevcut kodun kırılmaması için oluşturuldu . (Örneğin, yieldfinansal kodla çalışıyorsanız adlandırılmış bir değişkene sahip olmak çok mantıklıdır .) "Verim getirisi" o zamana kadar bir sözdizimi hatası olacağından, yeni sözdizimi mevcut herhangi bir kodu kırmaz.

Gelince yield break, hiçbir fikrim yok. Bunun arkasında bulabileceğim iyi bir neden yok gibi görünüyor.


O yield x;zamanlar sözdizimi hatası da olmaz mıydı ?
Moop

1
@Moop: Bunu yaparak yield return, sözdizimi hatası olup olmadığını düşünmenize bile gerek yok. Çarpışma şansı sıfır olur.
Robert Harvey

2
"Verim kırılması;" için esasen "geri dönüş;" geçersiz bir yöntemle, ancak "return" kullanarak; "geri dönüş verimi" ile kombinasyon halinde; kafa karıştırıcı olabilir. Dolayısıyla, "verim kırılması" seçimi, "verim getirisi" nin seçilmesinin bir sonucudur.
Cyanfish

3
Adlı bir tür olsaydı @Moop yieldsonra yield x;bir sözdizimi hatası olmaz, ancak geçerli bir değişken bildirimi.
Bojan Resnik

1
@moop: Ayrıca bkz ericlippert.com/2009/05/11/reserved-and-contextual-keywords ve blogs.msdn.com/b/ericlippert/archive/2010/09/27/... eğer olmadan yeni anahtar kelimeler tanıtılması konusu herhangi bir kodu kırmak ilginizi çeker.
Eric Lippert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.