2009-10-02 22 views
7

क्या सी # इटरेटर ब्लॉक में कोड का एक ब्लॉक प्रदान करने के लिए कोई तरीका है जो फोरच समाप्त होता है (या तो स्वाभाविक रूप से टूटने से) संसाधनों को साफ करने के लिए कहता है?'अंत में' Iterators में ब्लॉक

सबसे अच्छा मैं उपयोग कर रहा हूं उपयोग के निर्माण का उपयोग करना है, जो ठीक है लेकिन साफ ​​करने के लिए एक आईडीस्पोजेबल क्लास की आवश्यकता है। उदाहरण के लिए:

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(); 
     } 
    } 

उत्तर

5

try/finally जब तक कि फोन करने वाले कॉल IEnumerator<T> पर Dispose एक foreach उपयोग कर रहा है या मैन्युअल रूप से ठीक काम करता है,। ईमानदार होने के लिए, यदि संसाधनों को साफ करना है, तो using कथन शायद इसे करने का सबसे अच्छा तरीका होगा - यदि आप ऐसे संसाधन का उपयोग कर रहे हैं जिसे सफाई की आवश्यकता है लेकिन IDisposable लागू नहीं करता है, तो यह स्वयं में एक चिंता है :)

explained on Eric Lippert's blog के रूप में आप इटरेटर ब्लॉक में क्या कर सकते हैं, इस पर कुछ प्रतिबंध हैं, लेकिन यह सभी मामलों में बहुत अच्छी तरह से काम करता है।

आपको my article about iterator block implementationfinally का अनुवाद करने के तरीके में दिलचस्प लगता है।

0

try/finally इस मामले में काम करता है।

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(); 
    } 
} 
संबंधित मुद्दे