Создание нового объекта очень дешево. Вам нужно будет создать множество объектов в очень узком цикле, чтобы заметить разницу ... но в то же время это не бесплатно . Вам также нужно помнить, что затраты наполовину скрыты - у вас есть некоторые авансовые затраты при создании объекта, но также это означает, что сборщику мусора предстоит больше работы.
Так стоит ли более чистый дизайн производительности? Мы не можем вам этого сказать - это зависит от того, как используется ваш код. Я сильно подозреваю, что снижение производительности будет незначительным, но если вы используете это в узком цикле, это может быть не так. Есть только один способ выяснить это: измерить, если вы обеспокоены. Лично я бы, наверное, просто выбрал более чистый дизайн и проверял производительность только тогда, когда казалось, что это становится проблемой.
(Кстати, если этот метод работает с диском или базой данных, разница почти привязана к незначительной.)
Кстати, одно предложение: действительно ли ваш тип HistoryEntry
должен быть изменчивым? Не могли бы вы сделать все свойства доступными только для чтения, подкрепленными личными переменными только для чтения?
Просто упомянуть точку зрения Уилла - я с ним несколько согласен. Если эти два метода являются только местами, где вам нужна эта концепция, я вовсе не уверен, что ради нее стоит создать новый тип. Не из-за аспекта производительности, а просто потому, что вы вводите дополнительный пакет кода без какой-либо очевидной выгоды. Здесь демонстрируется ключевое слово - если вы на самом деле используете тот же набор параметров в других местах или могли бы с пользой поместить логику в класс HistoryEntry
, это совсем другое дело.
РЕДАКТИРОВАТЬ: Просто чтобы ответить на вопрос о нескольких целочисленных аргументах - C # 4 позволит именованные аргументы, которые должны сделать это проще. Чтобы вы могли позвонить:
AddHistoryEntry(userId: 1, companyId: 10);
Чтобы сделать имена видимыми с помощью дополнительного класса, необходимо:
- Именованные аргументы конструктора из C # 4 (в этом случае вам не лучше, чем с помощью метода)
- Изменяемые типы (urgh - это может привести к трудным отслеживанию ошибок, которых не было бы в оригинальной версии)
- Длинные статические имена методов для создания экземпляров ("FromUserAndCompanyId"), которые становятся громоздкими с большим количеством параметров
- Изменяемый тип конструктора
- Набор методов «С»:
new HistoryEntry().WithCompanyId(...).WithUserId(...)
- это затрудняет проверку во время компиляции того, что вы предоставили все необходимые значения.