Оба. Или это зависит.
Написание меньшего количества кода - это всегда хорошо, так что полагаться на конструктор по умолчанию - хорошая идея. Однако также подумайте о местах, где вы будете использовать класс. Что из этого кажется проще?
Complex c = new Complex { Real = 1d, Imaginary = 0.5 };
Complex c = new Complex(1d, 0.5d);
Первый вариант более понятен в том смысле, что вы можете легко увидеть, какие значения являются какими свойствами, но его также можно записать дольше.
Тогда есть еще вопрос управления состоянием объекта. Используя свойства и конструктор по умолчанию, вы не можете объявить обязательные свойства. Можно утверждать, что это необязательно для объекта данных, но в зависимости от того, как именно вы собираетесь его использовать, это может быть важно.
Лично я склонен создавать свои объекты передачи данных (которые вряд ли являются объектами) с пустыми конструкторами, чтобы упростить сериализацию, а также удобные конструкторы, которые я использую во всем коде. Для моих объектов значений я использую только явные конструкторы с обязательными свойствами, чтобы обеспечить правильное состояние.