'Когда вызывается конструктор для объекта A?'помогает ответить на вопрос.
new ThreadStart((new A(i)).Do))
Когда эта строка кода выполняется - вызывается конструктор и сохраняется ссылка на функцию .Do
во вновь созданном объекте Aделегат ThreadStart.
В строках 2 и 3 вы используете анонимный делегат (представлен в C # 2.0).
delegate() { (new A(i)).Do(); })
Содержимое анонимного делегата не выполняется, пока не будет вызван делегат;в этом случае потоком, когда для этого назначается временной интервал.
Переменная i объявляется только один раз в начале цикла for, и на содержимое делегата есть ссылка (делегаты будутdo this) - когда код выполняется, он должен получить значение i во время выполнения.
Это объясняет значение 10. У меня есть значение 10, когда цикл завершится.Если один из потоков выполняется после завершения цикла, он выведет 10.
Чтобы избежать проблемы с несколькими числами, вы можете создать локальную копию переменной цикла.Делегат сохранит ссылку на собственную версию icopy;
for (int i = 0; i < 10; i++)
{
int icopy = i;
(new Thread(new ThreadStart(delegate() { (new A(icopy)).Do(); }))).Start();
}