2010-02-11 3 views
5

Jon이 대답 할 때 훌륭한 일을했던이 질문을 보면서 ... 'How to read a text file reversly with iterator'. 그리고 비슷한 질문이있었습니다. 포인터를 사용하여 답변을 얻었습니다. '.net is there a way to read a text file from bottom to top'이 닫히기 전에 ....반복기 컨텍스트에서 안전하지 않은 키워드를 사용할 수없는 이유는 무엇입니까?

포인터를 사용하여이 문제를 해결하려고했습니다. 좋아, 거칠고 거친 것처럼 보입니다. C# 컴파일러 오류 CS1629와 거부 할 때 가장자리 주위에 ...

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

하지만

은 황폐화 된 C# 컴파일러는이 구현을 사용하여이 문제를 처리 할 수 ​​있다는 것을 발견하지만 - '에 나타나지 않을 수 있습니다 안전하지 않은 코드 반복자'

왜 이렇게이다?

+0

'yield yield'가 어떻게 작동하는지 생각해보십시오. –

답변

1

그것은 C#을 사양의 한 부분이다 :

26.1 반복자 블록 ... 그것은 반복자 블록이 안전하지 않은 컨텍스트를 포함 할 컴파일 타임 오류가 (§27.1). 반복기 블록은 항상 이 선언문이 안전하지 않은 컨텍스트에 중첩되어있는 경우에도 안전한 컨텍스트를 정의합니다.

아마도 '컴파일러가 생성 한 코드는'안전하지 않은 '레이블을 지정할 필요가 없으므로 검증 할 필요가 있습니다. 포인터를 사용하려면 IEnumerator를 직접 구현해야합니다.

+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]; 
} 

포인터를 어지럽히는 것의 장점은 무엇입니까?

관련 문제