2009-10-02 16 views
7

Bir C# yineleyici bloğunda, foreach uçları (doğal olarak bozulduğunda) çalıştırılacak kod bloğunu sağlamak için kaynakların temizlenmesini söyleyecek bir yol var mı?'Nihayet' Yineleyicilerde Engelle

En iyisi, en iyisi olan, ancak yapıyı temizlemek için IDisposable sınıfına ihtiyaç duyan kullanma yapısını kullanmak. Örneğin:

public static IEnumerable<string> ReadLines(this Stream stream) 
    { 
     using (StreamReader rdr = new StreamReader(stream)) 
     { 
      string txt = rdr.ReadLine(); 
      while (txt != null) 
      { 
       yield return txt; 
       txt = rdr.ReadLine(); 
      } 
      rdr.Close(); 
     } 
    } 

cevap

5

try/finally kadar uzun arayan IEnumerator<T> üzerinde Dispose çağırır elle foreach kullanıyorsa ya da, gayet iyi çalışıyor. Dürüst olmak gerekirse, kaynakları temizlemekse, bir using ifadesi muhtemelen en iyi şekilde yapmanın yolu olacak - eğer temizlenmesi gereken ancak IDisposable uygulanmayan bir kaynak kullanıyorsanız, bu kendi başına bir endişe kaynağıdır. :)

Eğer explained on Eric Lippert's blog olarak, yineleyici bloklarda yapabilecekleriniz hakkında bazı kısıtlamalar vardır, ama hepsi çoğu durumda çok güzel çalışıyor.

Sen finally çevrilmiştir nasıl açısından my article about iterator block implementation ilginç bulabilir. Bu durumda

0

try/finally çalışır.

public static IEnumerable<string> ReadLines(this Stream stream) 
{ 
    StreamReader rdr = new StreamReader(stream); 

    try 
    { 
     string txt = rdr.ReadLine(); 
     while (txt != null) 
     { 
      yield return txt; 
      txt = rdr.ReadLine(); 
     } 
     rdr.Close(); 
    } 
    finally 
    { 
     rdr.Dispose(); 
    } 
} 
İlgili konular