Una diferencia clave es el método .ForEach se puede modificar la colección subyacente. Con la sintaxis foreach obtendrá una excepción si lo hace. Aquí hay un ejemplo de eso (no exactamente el mejor aspecto pero funciona):
static void Main(string[] args) {
try {
List<string> stuff = new List<string>();
int newStuff = 0;
for (int i = 0; i < 10; i++)
stuff.Add(".");
Console.WriteLine("Doing ForEach()");
stuff.ForEach(delegate(string s) {
Console.Write(s);
if (++newStuff < 10)
stuff.Add("+"); // This will work fine and you will continue to loop though it.
});
Console.WriteLine();
Console.WriteLine("Doing foreach() { }");
newStuff = 0;
foreach (string s in stuff) {
Console.Write(s);
if (++newStuff < 10)
stuff.Add("*"); // This will cause an exception.
}
Console.WriteLine();
}
catch {
Console.WriteLine();
Console.WriteLine("Error!");
}
Console.ReadLine();
}
Acabo de recibir mis "nuevas cosas aprendidas" para hoy. Gracias. –
Esto es porque bajo las mantas, 'ForEach (Acción)' utiliza un bucle. En Reflector se ve así: 'for (int i = 0; i
(Curiosamente, Reflector también muestra que alguien en Microsoft descuidadamente cortó y pegó la verificación nula de uno de los métodos 'List' con un parámetro llamado "coincidencia". Si pasa null como 'Acción ', es ' Te diré que el parámetro "coincidencia" es nulo en lugar del parámetro de "acción" correcto. –