2010-02-11 14 views
5

इस सवाल को देखते हुए कि जॉन ने जवाब देने में एक अच्छा काम किया ... 'How to read a text file reversly with iterator'। और एक ऐसा सवाल था जिसमें मैंने पॉइंटर्स होकस पॉकस का उपयोग करने का उत्तर दिया .. .net is there a way to read a text file from bottom to top 'इसे बंद करने से पहले ....आप एक इटरेटर संदर्भ में एक असुरक्षित कीवर्ड का उपयोग क्यों नहीं कर सकते?

अब मैंने पॉइंटर्स का उपयोग करके इसे हल करने का प्रयास करने के लिए तैयार किया है, ठीक है, यह हैकिश और मोटा दिखता है किनारों के आसपास ...

 
public class ReadChar : IEnumerable<char> 
{ 
    private Stream _strm = null; 
    private string _str = string.Empty; 
    public ReadChar(string s) 
    { 
     this._str = s; 
    } 
    public ReadChar(Stream strm) 
    { 
     this._strm = strm; 
    } 
    public IEnumerator<char> GetEnumerator() 
    { 
     if (this._strm != null && this._strm.CanRead && this._strm.CanSeek) 
     { 
      return ReverseReadStream(); 
     } 
     if (this._str.Length > 0) 
     { 
      return ReverseRead(); 
     } 
     return null; 
    } 

    private IEnumerator<char> ReverseReadStream() 
    { 
     long lIndex = this._strm.Length; 
     while (lIndex != 0 && this._strm.Position != 0) 
     { 
      this._strm.Seek(lIndex--, SeekOrigin.End); 
      int nByte = this._strm.ReadByte(); 
      yield return (char)nByte; 
     } 
    } 

    private IEnumerator<char> ReverseRead() 
    { 
     unsafe 
     { 
      fixed (char* beg = this._str) 
      { 
       char* p = beg + this._str.Length; 
       while (p-- != beg) 
       { 
        yield return *p; 
       } 
      } 
     } 
    } 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

लेकिन पता चला कि सी # संकलक इस इस कार्यान्वयन का उपयोग नहीं कर सकता है, लेकिन तबाह हो गया था जब सी # संकलक एक त्रुटि CS1629 के साथ मना कर दिया - 'असुरक्षित कोड में दिखाई न दें iterators'

ऐसा क्यों हैं?

+0

इस बारे में सोचें कि 'उपज वापसी' कैसे काम करता है। –

उत्तर

1

यह सी # कल्पना का सिर्फ हिस्सा है:

26,1 इटरेटर ब्लॉक ... यह एक iterator ब्लॉक एक असुरक्षित संदर्भ शामिल करने के लिए के लिए एक संकलन समय त्रुटि है (§27.1)। एक पुनरावर्तक ब्लॉक हमेशा एक सुरक्षित संदर्भ परिभाषित करता है, भले ही इसकी घोषणा एक असुरक्षित संदर्भ में घोंसला हो।

संभवतः, कंपाइलर द्वारा उत्पन्न कोड को 'असुरक्षित' लेबल करने की आवश्यकता नहीं है। यदि आप पॉइंटर्स का उपयोग करना चाहते हैं, तो आपको खुद को आईन्यूमेरेटर को लागू करना होगा।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन निश्चित रूप से निश्चित कीवर्ड का उपयोग गारंटी है कि आप सीमाओं के भीतर हैं ... ??? जैसे कि आप शायद कुछ ऐसा नहीं कर रहे हैं जो आपके कोड से संबंधित नहीं है ... और यह पढ़ा गया है, इसलिए ... – t0mm13b

+0

@ tommieb75: सच नहीं है, पॉइंटर्स का उपयोग करके अविश्वसनीय साइड इफेक्ट्स हैं। ओह, एरिक लिपर्ट ने इस पर चर्चा की ... पढ़ने के लिए बंद! – codekaizen

+0

धन्यवाद! ;) इसे भी पढ़ रहा हूं और इसके बारे में सोच रहा हूं ... – t0mm13b

6

कारण है कि आप सब इस बात के लिए संकेत का प्रयोग करेंगे क्या मैं जानना चाहता हूँ है। क्यों नहीं बस कहते हैं:

private IEnumerator<char> ReverseRead() 
{ 
    int len = _str.Length; 
    for(int i = 0; i < len; ++i) 
     yield return _str[len - i - 1]; 
} 

संकेत के साथ चारों ओर खिलवाड़ के सम्मोहक लाभ क्या है?

संबंधित मुद्दे