Declarar una variable dentro o fuera de un ciclo foreach: ¿cuál es más rápido / mejor?

¿Cuál de estos es el más rápido / mejor?

Éste:

List list = new List(); User u; foreach (string s in l) { u = new User(); u.Name = s; list.Add(u); } 

O este:

 List list = new List(); foreach (string s in l) { User u = new User(); u.Name = s; list.Add(u); } 

Mis habilidades para el desarrollo de novatos me dicen que el primero es mejor, pero un amigo me dice que estoy equivocado, pero no podía darme una buena razón por la cual el segundo es mejor.

¿Hay alguna diferencia en el rendimiento en absoluto?

En términos de rendimiento, ambos ejemplos se comstackn en la misma IL, por lo que no hay diferencia.

El segundo es mejor, porque expresa más claramente tu intención si solo se usa dentro del ciclo.

En cualquier caso, la mejor manera sería usar un constructor que tome un nombre … o, de lo contrario, explotar la notación de llaves:

 foreach (string s in l) { list.Add(new User(s)); } 

o

 foreach (string s in l) { list.Add(new User() { Name = s }); } 

o incluso mejor, LINQ:

 var list = l.Select( s => new User { Name = s}); 

Ahora, aunque su primer ejemplo podría, en algunos casos, ser increíblemente más rápido, el segundo es mejor porque es más legible, y el comstackdor puede descartar la variable (y omitirla por completo) ya que no se usa fuera del scope del scope.

Una statement no hace que se ejecute ningún código, por lo que no es un problema de rendimiento.

El segundo es lo que quieres decir, y es menos probable que cometas un error estúpido si lo haces de la segunda manera, así que úsalo. Intente siempre declarar las variables en el scope más pequeño que sea necesario.

Y además, la mejor forma es usar Linq:

 List users = l.Select(name => new User{ Name = name }).ToList();