una programacion metodos metodo mandar llamar instanciar ejemplos como clases clase anidar anidados anidado anidadas c# ienumerable yield

programacion - instanciar una clase c#



C#rendimiento en método anidado (1)

En realidad no estás usando el resultado de ReturnOne . Está llamando al método e ignorando el valor de retorno ... lo que significa que nunca vería que se esté ejecutando ninguno de sus códigos. Puedes hacerlo así:

static IEnumerable<int> OneThroughFive() { foreach (int x in ReturnOne()) { yield x; } yield return 2; yield return 3; yield return 4; yield return 5; }

C # no (actualmente al menos :) tiene una especie de construcción de "producir todo".

El hecho de que no esté entrando en él no tiene nada que ver con el hecho de que haya recibido una llamada dentro de un bloque de iteradores; es solo que, hasta que empiece a usar el resultado de un bloque de iteradores, no se ejecuta ningún código. . Es por eso que necesita separar la validación de los argumentos del rendimiento. Por ejemplo, considere este código:

public IEnumerator<string> ReturnSubstrings(string x) { if (x == null) { throw ArgumentNullException(); } for (int i = 0; i < x.Length; i++) { yield return x.Substring(i); } } ... ReturnSubstring(null); // No exception thrown

Necesitas escribirlo así:

public IEnumerator<string> ReturnSubstrings(string x) { if (x == null) { throw ArgumentNullException(); } return ReturnSubstringsImpl(x); } private IEnumerator<string> ReturnSubstringsImpl(string x) { for (int i = 0; i < x.Length; i++) { yield return x.Substring(i); } }

Para obtener más detalles, lea el capítulo 6 de C # en profundidad, que resulta ser un capítulo gratuito en la primera edición :) Consíguelo aquí .

Si paso por el siguiente código, se omite la llamada a ReturnOne ().

static IEnumerable<int> OneThroughFive() { ReturnOne(); yield return 2; yield return 3; yield return 4; yield return 5; } static IEnumerator<int> ReturnOne() { yield return 1; }

Solo puedo asumir que el compilador lo está eliminando porque lo que estoy haciendo no es válido. Me gustaría la posibilidad de aislar mi enumeración en varios métodos. es posible?