Объявление переменной внутри или вне цикла foreach: что быстрее/лучше?

Какой из них быстрее/лучше?

Этот:

List<User> list = new List<User>();
User u;

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

Или этот:

List<User> list = new List<User>();

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

Мои новички-навыки развития говорят мне, что первый лучше, но мой друг говорит мне, что я ошибаюсь, но не мог дать мне вескую причину, почему второй лучше.

Есть ли разница в производительности вообще?

Ответ 1

Производительность обоих примеров скомпилирована для одного и того же ИЛ, поэтому нет никакой разницы.

Второй лучше, потому что он более четко выражает ваше намерение, если u используется только внутри цикла.

Ответ 2

В любом случае лучшим способом было бы использовать конструктор, который принимает имя... или, в противном случае, использует вставную фигуру:

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

или

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

или даже лучше, LINQ:

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

Теперь, хотя ваш первый пример мог бы в некоторых случаях быть неповторимо быстрее, второй лучше, потому что он более читабельный, и компилятор может отбросить переменную (и вообще ее не указывать), так как она не использовалась вне foreach область действия.

Ответ 3

Объявление не вызывает запуск какого-либо кода, поэтому это не проблема производительности.

Второй - это то, что вы имеете в виду, и вы с меньшей вероятностью сделаете глупую ошибку, если вы сделаете это вторым способом, поэтому используйте это. Всегда старайтесь объявлять переменные в минимальном объеме.

И кроме того, лучший способ - использовать Linq:

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

Ответ 4

Всякий раз, когда у вас возникает вопрос о производительности, единственное, что нужно сделать, это измерить - запустить цикл вокруг вашего теста и время его.

Чтобы ответить на ваш вопрос - не измеряя:-) или глядя на сгенерированный илмас - любая разница не будет заметна при значительном числе итераций и самой дорогой операции в вашем коде, вероятно, будет выделено пользователем на несколько порядков, поэтому сосредоточьтесь на ясности кода (как и следовало бы в целом) и пойдите с 2.

О, его поздно, и я предполагаю, что я просто пытаюсь сказать, не волнуйся об этом, или не увлекся подробностями.

К

Ответ 5

Второй лучше. Вы хотите иметь нового пользователя на каждой итерации.

Ответ 6

Технически, первый пример сохранит несколько наносекунд, потому что фрейм стека не нужно будет перемещать, чтобы выделить новую переменную, но это такое крошечное количество процессорного времени, которое вы не заметите, если компилятор не оптимизирует никакую разницу в любом случае.

Ответ 7

В этом случае вторая версия лучше.

В общем случае, если вам нужно только получить доступ к значению внутри тела итерации, выберите вторую версию. С другой стороны, если есть какое-то конечное состояние, переменная будет удерживаться за пределами тела цикла, тогда объявите затем использовать первую версию.

Ответ 8

Не должно быть существенной разницы в производительности.