Bu C # verim anahtar kelime ile yapmıyor özel bir şey - eylem wwwÖzellikle bu anahtar kelime yalnızca döndüren bir yöntemle bir kullanılabilir nesne, onun içerdiği yöntem için oldukça getirme aracı özel bir şey. IEnumerable(Veya IEnumerator) ve kullanılır MoveNext çağrıldığında numaralandırıcı tarafından hangi nesnenin "döndürüleceğini" belirtmek için .
Derleyici, tüm yöntemi bir durum makinesi kullanarak IEnumerable(veya IEnumerator) uygulayan ayrı bir sınıfa dönüştürdüğü için çalışır - net sonuç, biri dönüş değeriyle numaralanana kadar yöntemin gövdesinin yürütülmemesidir. Bu herhangi bir tür ile çalışacak, kesinlikle özel bir şey yok WWW, daha ziyade özel içeren yöntem.
C # derleyicisinin ne tür bir kod oluşturduğuna dair daha fazla bilgi için C # verim anahtar kelimesinin perde arkasına bakın veya IL Spy gibi bir şey kullanarak kodu kendiniz deneyin ve inceleyin
Güncelleme: Açıklığa kavuşturmak için
- Unity bir
yield returnifade içeren bir couteini çağırdığında, olan tek şey bir numaralandırıcının döndürülmesidir - bu aşamada yöntem gövdesinin hiçbiri yürütülmez
- Yöntem gövdesinin çalıştırılmasını sağlamak için Unity
MoveNextdizideki ilk değeri almak için yineleyiciyi çağırmalıdır . Bu, yöntemin ilk yeild returnifadeye kadar çalışmasına neden olur; bu noktada, çağıranın devam ettiği nokta (ve muhtemelen Unity, çerçevenin geri kalanını oluşturmak için devam eder)
- Anladığım kadarıyla Unity normalde daha
MoveNextsonra her bir karede bir kez yineleyici üzerindeki yöntemi çağırmaya devam eder, bu da yöntemin yield returnsonuna veya bir yield breakifadeye ulaşana kadar yöntemin her karede bir sonraki ifadeye kadar tekrar yürütülmesine neden olur. dizinin sonu)
Sadece özel burada biraz (ve bir de çiftin arasında diğer durumlarda ) yerine sadece indirme tamamlandığında (yürütme devam etmek yöntemi neden olan) yineleyici ilerletir, Birlik bu özel yineleyici bir sonraki kareyi ilerlemek olmamasıdır. Her ne kadar bir yineleyici ilerlemesi gerektiğinde Unity'ye sinyal vermek için genel bir mekanizma içeren bir temel YieldInstruction sınıfı var gibi görünse de , WWWsınıf bu sınıftan miras almıyor gibi görünüyor, bu yüzden sadece özel bir durum olduğunu varsayabilirim. Unity motorunda bu sınıf.
Açık olmak gerekirse - yieldanahtar kelime WWWsınıfa özel bir şey yapmaz , bunun yerine Unity'nin bu davranışa neden olan döndürülen numaralandırma üyelerine verdiği özel işlemdir.
İkincisini güncelleyin:WWW Web sayfalarını eşzamansız olarak indirmek için kullanılan mekanizmaya gelince, muhtemelen dahili olarak eşzamansız IO kullanacak veya alternatif olarak (özel bir iş parçacığı oluşturarak veya bir iş parçacığı havuzu kullanarak) iş parçacığı kullanabilen HttpWebRequest.BeginGetResponse Yöntemi'ni kullanır .
yield returnEşzamansız işlemler için kullanmanın bir saldırı olduğunu unutmayın. "Gerçek" bir C # programında bununTaskiçin a kullanırsınız . Unity, muhtemelen kullanılmadığı için .Net 4.0'dan önce oluşturulduğu için bunları kullanmıyorTask.