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 return
ifade 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
MoveNext
dizideki ilk değeri almak için yineleyiciyi çağırmalıdır . Bu, yöntemin ilk yeild return
ifadeye 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
MoveNext
sonra her bir karede bir kez yineleyici üzerindeki yöntemi çağırmaya devam eder, bu da yöntemin yield return
sonuna veya bir yield break
ifadeye 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 , WWW
sı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 - yield
anahtar kelime WWW
sı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 return
Eşzamansız işlemler için kullanmanın bir saldırı olduğunu unutmayın. "Gerçek" bir C # programında bununTask
iç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
.