Технически, между вашими фрагментами есть небольшое различие в поведении при вызове виртуальных функций из конструктора базового класса, но в любом случае выполнение виртуальных функций во время построения является плохой практикой, поэтому давайте проигнорируем это.
Я бы предпочел второе. Если у вас перегружены конструкторы, это сохраняет некоторые копии / вставки, и никто не должен забывать писать оператор присваивания - обо всем этом позаботится компилятор.
Если вычисление присвоенного значения слишком сложно или его нельзя присвоить инициализатору поля, у меня будет защищенный (или частный) конструктор по умолчанию
class Foo
{
private Foo() { _second = SomeComplexCalculation(); }
public Foo(string first) : this()
{
_first = first;
}
}
Если порядок назначения имеет значение, тогда у меня будет частная функция, выполняющая инициализацию.