Почему вы не можете определить явный конструктор? Это то, что они для .
Более того, почему вы думаете, что «не можете позволить себе выделение кучи»? Распределение кучи очень дешево в управляемых языках. Как вы проверили это предположение о том, что вы не можете позволить себе выделение кучи, или что выделение кучи в первую очередь дороже?
(Для типа, состоящего из "double и нескольких параметров", я подозреваю, что вы находитесь в размере, где выделение кучи на самом деле дешевле и эффективнее)
В любом случае, вы не можете запретить пользователю вызывать конструктор по умолчанию для типа значения, если он того пожелает. Все, что вы можете сделать, это убедиться, что существует лучший способ инициализации значения, такой как конструктор не по умолчанию, или, если по какой-либо причине вы не можете создать его, функция, которая создает и инициализирует ваш тип значения при вызове.
Но, конечно, у вас нет никаких гарантий, что люди на самом деле называют это.
Изменить:
Распределение кучи в .NET в основном состоит из простой операции выталкивания стека. Это хорошо в управляемых (и сборочных) языках. Среда выполнения по существу использует большой стек в качестве кучи, поэтому каждое выделение просто увеличивает указатель стека (конечно, после проверки, что свободной памяти достаточно).
Затем сборщик мусора по мере необходимости заботится об сжатии памяти.
Так что выделение кучи само по себе смехотворно дешево. Конечно, дополнительное давление ГХ может снова замедлить вас (хотя, насколько мне известно, время, необходимое для прохода ГХ, зависит только от количества живых объектов, а не от тех, которые должны быть собраны с помощью ГХ, так что их не будет » «мертвые» объекты, лежащие вокруг, могут не быть большой проблемой), но с другой стороны, распределение стека также не является бесплатным. Типы значений передаются по значению, поэтому каждый раз, когда вы передаете свой тип в качестве параметра функции или возвращаете его, необходимо сделать копию. Я не знаю, насколько велико ваше значение, но значение double равно 8 байтам, и, учитывая, что у вас есть несколько дополнительных параметров, я предполагаю, что 32 байта. Это может быть настолько большим, что дополнительное копирование, необходимое для типов значений, делает его медленнее, чем если бы вы использовали выделение кучи. Возможно.
Как видите, существуют преимущества как для типов значений, так и для типов ссылок. Я не могу сказать, какой из них быстрее в вашем случае, но на вашем месте я бы очень осторожно делал подобные предположения. Если это возможно, структурируйте свой код так, чтобы вы могли переключаться между реализацией ссылочного и оценочного типа, и посмотрите, какая из них работает лучше всего. В качестве альтернативы, напишите меньшие тесты, чтобы попытаться предсказать, как каждый из них будет работать в больших масштабах.