Для забавы я вытолкал Список в отражатель, и это - получающийся C#:
public void ForEach(Action<T> action)
{
if (action == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
for (int i = 0; i < this._size; i++)
{
action(this._items[i]);
}
}
Точно так же MoveNext в Перечислителе, который является тем, что используется foreach, является этим:
public bool MoveNext()
{
if (this.version != this.list._version)
{
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
if (this.index < this.list._size)
{
this.current = this.list._items[this.index];
this.index++;
return true;
}
this.index = this.list._size + 1;
this.current = default(T);
return false;
}
Список. ForEach намного более обрезается вниз, чем MoveNext - намного меньше обработки - будет более вероятный JIT во что-то эффективное..
, Кроме того, foreach () выделит новый Перечислитель несмотря ни на что., GC является Вашим другом, но если Вы сделаете тот же foreach неоднократно, это сделает больше холостых объектов, в противоположность многократному использованию того же делегата - , НО - это - действительно случай края. В типичном использовании Вы будете видеть минимальное различие.
Мы используем CruiseControl.net и SVN. Мы едем в другую сторону. Мы используем задачу MSBuildCommunityTasks Version в сценарии MSBuild для увеличения номера версии для сборок CI и использования этого номера версии для маркировки исходного кода.
РЕДАКТИРОВАТЬ: Требуются дополнительные сведения о целях MSBuild ...
Мы используем отдельный сценарий, который предназначен для сборки CI и не используется для сборок разработчика. Мы пробовали использовать разные цели в файлах MSBuild, которые студия использует в качестве файлов проекта, но это стало головной болью и требовало ручного редактирования файлов, которые создавала студия.
создать фактический файл проекта. Скрипт MSBuild в режиме выпуска
AfterBuild: мы запускаем наши проекты модульного тестирования (в качестве защиты от создания тегов для неработающих сборок на следующих шагах), используем задачи SvnInfo и некоторые задачи RegexReplace для установки некоторых переменных с путями и именами тегов и используйте задачу SvnCopy для создания тега.
Password = "password"
SourcePath = "@ (SvnTrunkPath)"
DestinationPath = "@ (SvnTagsPath) / BUILD - $ (TargetAssembly) - $ (Major ). $ (Незначительный). $ (Сборка). $ (Редакция) "
Message = "Пометка успешной сборки" />