Странно, но крутая новая фишка Visual Studio 2012 проскочила практически мимо официальных анонсов.

Visual Studio 2012 научилась компилировать проекты в несколько потоков.

Сами по себе и Visual Studio 2010, и msbuild поддерживали параллельное построение уже достаточно давно. Но по какой-то неизвестной причине работали они “из коробки” только для проектов Visual C++. Для C# приходилось использовать обходные пути, вроде прикручивания mbuild через External Tools.

В Visual Studio 2012 ограничение “только для C++” убрали. Так что не удивляйтесь, увидев для своего проекта в output загадочные числа в начале каждой строки:

1>------ Rebuild All started: Project: ClassLibrary1, Configuration: Debug Any CPU ------
2>------ Rebuild All started: Project: ClassLibrary2, Configuration: Debug Any CPU ------
2>  ClassLibrary2 -> C:Users...ClassLibrary2binDebugClassLibrary2.dll
1>  ClassLibrary1 -> C:Users...ClassLibrary1binDebugClassLibrary1.dll
========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========

Количество одновременно собираемых проектов задается в Tools > Options > Projects and Solutions > Build and Run:

image

Опция глобальная, включена по умолчанию, и действует на все проекты (в том числе и на сконвертированные из предыдущих версий Visual Studio). Надеюсь, внезапно ускорившиеся билды и нелинейный output не станут для вас неприятным сюрпризом 😉

…по мотивам одной рассылки

Что выведет следующий код (при сборке под .NET 4.0 в 2010-й студии)?

using System;

class Base
{
   
public virtual bool Method1(bool value) { return true
; }
   
public virtual bool Method2(bool value) { return true
; }
}

class Derived : Base
{
   
public override bool Method1(bool value = true
)
    {
       
return
value;
    }

   
public override bool Method2(bool value = true
)
    {
       
return
Method1();
    }
}

class Program
{
   
static void Main(string
[] args)
    {
       
Derived a = new Derived
();

       
Console.WriteLine("Call to Method1, expected: True, got: {0}"
, a.Method1());
       
Console.WriteLine("Call to Method2, expected: True, got: {0}", a.Method2());
    }
}

Что выведет этот же код, если собрать его в Visual Studio 2012?