SORU
24 EKİM 2008, Cuma


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
24 EKİM 2008, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FlippinWindows | #1 Windows Tutorial Channel!

    FlippinWindo

    23 Mayıs 2010
  • Marques Brownlee

    Marques Brow

    21 Mart 2008
  • Sorikan

    Sorikan

    3 ŞUBAT 2008