Neden IEnumerator IDisposable T inherts, ama genel olmayan IEnumerator DEĞİL mi?
Genel IEnumerator(T) IDisposable devraldığı, ama genel olmayan arayüzü IEnumerator OLMADIĞINI fark ettim. Neden tasarlanmıştır bu şekilde?
Genellikle, foreach ifadesi(T) IEnumerator bir örnek üzerinden gitmek için kullanıyoruz. Dosyalarda grup için oluşturulan kod aslında deneyin sonunda İmha çağıran blok var() sonunda.
Edit: aklım biraz dağınık bugün. IEnumerator IEnumerable düşünürken yazdım. O değişti.
CEVAP
Temelde bir yanlışlık. C# 1.0, 0**aslaDispose
denir1. C# 1.2 (sunulan VS2003 - 1.1, garip) foreach
başladı kontrol finally
blok ya da yineleyici uygulanan IDisposable
- yapmak zorunda bu şekilde, çünkü geriye dönük olarak yapma IEnumerator
uzatmak IDisposable
olurdu kırık herkese uygulanması IEnumerator
. Eğer foreach
başta kullanımına atılması için yararlı olduğunu çözmüş olsalardı, IEnumerator
IDisposable
genişletilmiş olurdu eminim.
C# 2.0 ve .2.0 çıktı NET, fakat bu yeni bir fırsat - Yeni Arayüz, Yeni bir miras vardı. Yapar çok daha mantıklı gerek arayüzü genişletmek IDisposable
böylece ihtiyacınız yok bir yürütme zamanı kontrol finally bloğu ve şimdi derleyici bilen varsa yineleyici bir IEnumerator<T>
olabilir yayarlar koşulsuz çağrı Dispose
.
EDİT: Dispose
yineleme (ancak biter) sonunda çağrılacak için inanılmaz faydalı. Yineleyici hattı ile, diyelim ki, dosya bir satır okumak için mümkün kılan kaynakları üzerinde tutmak anlamına gelir. Yineleyici bloklar jeneratör Dispose
uygulamaları hangi emin herhangi bir finally
blokları ile ilgili "geçerli nokta yürütme" yineleyici yürütüldüğü zaman bertaraf - yazma normal kod içinde yineleyici ve temizlik gerçekleşmeli uygun.
1Geri 1.0 spec bakarak, belli oldu. Henüz 1.0 uygulaması Dispose
aramadın ki bu daha önceki ifadesini doğrulamak mümkün olmamıştır.
Nedeninin ne olduğu neden Göster.get(O...
Neden Chrome, diğer tarayıcılar't...
Orada std olmayan bir atom eşdeğerdir:...
Neden't GCC*****a (**)*(**) optim...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...