なぜあなたはイテレータコンテキストで危険なキーワードを使用することはできませんか?

StackOverflow https://stackoverflow.com/questions/2241417

  •  19-09-2019
  •  | 
  •  

質問

ジョンは答えに細かい仕事をしてくれたこの質問を見て...「<のhref = "https://stackoverflow.com/questions/452902/how-to-read-a-text-file-reversely -with-イテレータ・イン・C」> reverslyイテレータの」テキストファイルを読み込む方法。そして、私はポインタがポーカスホーカス使用して答えている同様の問題があった.. '<のhref = "https://stackoverflow.com/questions/2241012/net-is-there-a-way-to-read-a- TXT-ファイルから下から上へ/ 2241173#2241173" >。ネットは「を下から上にテキストファイルを読み込む方法があり、それが閉じてしまったの前に....

今、私はOK、それはエッジの周りハックとラフに見える、この使用してポインタを解決しようとするために着手しました...

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#コンパイラは、この実装を使用してこれを扱うことができないことを発見したが、C#コンパイラがエラーCS1629を拒否したときに荒廃していた - 「安全でないコードがイテレータに表示されない場合があります」

なぜそうでしょうか?

役に立ちましたか?

解決

エリックリペットは、ここでは、このトピックに関する優れたブログの記事があります:<のhref = "http://blogs.msdn.com/ericlippert/archive/2009/07/27/iterator-blocks-part-six-why-無危険な-code.aspx」のrel = "noreferrer">イテレータブロック、パート6:なぜ?いいえ、安全でないコードの

他のヒント

あなたがすべてで、このためにポインタを使用する理由

私が知りたいことはあります。なぜ単純に言ってます:

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

ポインタいじりの魅力的な利点は何でしょうか。

これは、C#の仕様のほんの一部です。

  

26.1イテレータブロック...それは危険な状況(§27.1)を含むように反復子ブロックは、コンパイル時エラーとします。常に反復子ブロック   その宣言は、安全でない状況にネストされている場合であっても、安全なコンテキストを定義します。

おそらく、コンパイラによって生成されますコードは「安全ではない」ラベル付けする必要がないために検証する必要があります。あなたは、ポインタを使用する場合は、IEnumeratorを自分で実装する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top