Я бы сказал, что этот совет определенно не применим к D.
Структуры являются типами значений.Классы являются ссылочными типами.Структуры обычно находятся в стеке (хотя они могут быть в куче и указываться указателями).Занятия в куче.Структуры не имеют наследования или полиморфизма.Классы имеют наследование и полиморфизм.
Это очень очень распространенное использование структур в D. Я думаю, что общее правило состоит в том, что если что-то не нуждается в полиморфизме, это должно бытьструктура. основная причина выбора класса вместо структуры заключается в том, что вы хотите наследования и полиморфизма.
Вторая причина будет в том случае, если для типа будет более разумным ссылочный тип (например, контейнер, вероятно, должен быть классом, так как копировать его каждый раз, когда вы передаете его функции, было бы плохо).Структуры могут иметь справочную семантику, но для этого просто использовать классы.
И, наконец, если тип содержит много данных и вам не нужно иметькопируйте его всякий раз, когда вы передаете его в функцию, тогда было бы более эффективно сделать его классом и копировать его только тогда, когда вам это действительно нужно (хотя вы можете выбрать просто всегда передавать его вместо ref вместо).
Структуры D определенно более привлекательны, чем структуры C #, поскольку в них есть деструкторы и конструкторы с постблитом .В D также нет проблем с автобоксом, поскольку D использует шаблоны (аналогично C ++, хотя и гораздо более мощные и более простые в использовании), а не универсальные шаблоны.И если вам нужен указатель на структуру, это легко сделать.Итак, я действительно не думаю, что рекомендации по C # применимы к D.
Мне кажется, что рекомендации по C # проистекают из двух вопросов:
- Тот факт, что структуры являютсятипы значений и, следовательно, имеют семантику значений.
- Тот факт, что структуры в C # имеют дело с автобоксом и должен очень беспокоиться о стоимости копирования.
Структуры также являются типами значенийв D, но они достаточно мощные, чтобы иметь возможность иметь ссылочную семантику, если хотите, и добавление постбликовых конструкторов и деструкторов делает их полезными на намного больше, чем то, что вы можете делать со структурами в C #,А поскольку у D нет автобокса, проблемы с автобоксом не относятся к D. Вы все еще не хотите, чтобы ваши структуры были огромными, поскольку, если вы не перейдете по ссылке, они будут копироваться всякий раз, когда вы их пропускаетек функции, но это определенно не такая большая проблема, как в C #.В этом отношении он гораздо больше соответствует C ++.
И совет об неизменности не распространяется вообще на D. Структуры D часто изменяемы, и это будет большой проблемой, еслиони не были.Например, диапазоны обычно реализуются как структуры, и это было бы невозможно, если бы вы не могли их мутировать.
Итак, нет, я не думаю, что совет C # действительно применим к D.Ситуация между двумя языками просто слишком различна.Было бы лучше думать о структурах D как о классах C ++, которые не имеют каких-либо базовых классов и не могут быть получены из них, поскольку это гораздо ближе к тому, чем они на самом деле являются, чем структуры C #.