index ejemplos array c# null c#-6.0 null-propagation-operator

ejemplos - foreach c# string



Operador de propagaciĆ³n nula y foreach. (4)

¿Leyendo mucho sobre el operador de propagación nula ?. , No encontré respuesta si es útil en el siguiente escenario.

Código que lanza:

int[] values = null; foreach ( var i in values ) // Throws since values is null. { // ... }

Para que esto funcione, tengo que agregar una comprobación null antes de acceder a la variable de values .

Lo más probable es que el código anterior esté fuera del alcance de las consideraciones de diseño para el operador de propagación nula. Sin embargo, para estar seguro, tengo que preguntar.

Mi pregunta:

¿Es útil el operador de propagación nula cuando se intenta acceder a colecciones null en un bucle foreach ?


¿Cómo te propones usarlo?

El código que proporcionó:

int[] values = null; foreach (var i in values) { // ... }

enx se expande en algo

int[] values = null; var enumerator = values.GetEnumerator(); try { while (enumerator.MoveNext()) { var i = enumerator.Current; // ... } } finally { var disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } }

Supongo que podrías escribir algo como esto:

int[] values = null; foreach (var i in values?.) { // ... }

El compilador tendría que expandirlo a algo como esto:

int[] values = null; var enumerator = values?.GetEnumerator(); try { while (enumerator?.MoveNext() ?? false) { var i = enumerator.Current; // ... } } finally { var disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } }

Y ten en cuenta que:

a = b?.M();

se expande en:

a = b == null ? null : b.M();

Si no desea escribir explícitamente la instrucción if , siempre puede confiar en el antiguo operador de fusión nula (??) :

int[] values = null; foreach (var i in values ?? Enumerable.Empty<int>()) { // ... }


He encontrado otra forma de trabajo:

Cuando MoreLinq fantásticas extensiones MoreLinq Jon Skeet (y otros), hay un método de extensión ForEach que puedo usar en mi ejemplo inicial como:

int[] values = null; values?.ForEach(i=> /*...*/); // Does not throw, even values is null.


No, no es. Está diseñado para permitir el acceso de miembros de un objeto de forma segura. En este caso, debe comprobar si la matriz es nula .


Para la List<T> puede usar la list?.ForEach(i => ...); y para otros enumerables puedes hacer tu propia extensión ForEach como esta:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { if (source == null) { return; } foreach (T item in source) { action(item); } }

Lo llamas así: myPossiblyNullEnumerable.ForEach(i => ...);

Si desea que su extensión ForEach se lance cuando se le solicitan nulos enumerables, simplemente puede dejar la comprobación nula y llamarla con la misma sintaxis de elvis que la versión de la Lista: myPossiblyNullEnumerable?.ForEach(i => ...);