Al ver esta pregunta, Jon hizo un buen trabajo al responder ... 'How to read a text file reversly with iterator'. Y hubo una pregunta similar en la que respondí usando punteros hocus pocus ... '.net is there a way to read a text file from bottom to top' antes de que se cerrara ...¿Por qué no puede usar una palabra clave insegura en un contexto de iterador?
Ahora me propuse intentar solucionar esto usando punteros, está bien, parece áspero y áspero alrededor de los bordes ...
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(); } }
pero descubrieron que compilador de C# no puede manejar esta usando esta aplicación, pero fue devastado cuando el compilador de C# se negó con un CS1629 de error - 'código no seguro puede no aparecer en los iteradores'
¿Por qué es así?
Piensa en cómo 'yield return' funciona bajo el capó. –