Я создал легкий класс с конструктором, который берет приблизительно 10 параметров. Класс не изменяет значения параметров; это просто хранит значения локально через конструктора.
Некоторые параметры являются ссылочными типами (строки, классы), и другие являются типами значения (интервал, bool, перечисления).
Мой вопрос, должен я передавать все параметры (кроме классов) через ссылку, т.е. использование ключевого слова ref
?
Мое внимание здесь является производительностью.
Используйте ref
, только если метод должен изменить параметры, и эти изменения необходимо передать в вызывающий код. Вам следует оптимизировать это только в том случае, если вы запустили его через профилировщик и определили, что узким местом действительно является CLR, копирующая параметры метода в стек.
Имейте в виду, что среда CLR сильно оптимизирована для вызова методов с параметрами, поэтому я не думаю, что это будет проблемой.
Нет. Для ссылочных типов вы уже передаете ссылку, нет необходимости передавать ссылку по ссылке, если только вы не хотите изменить то, на что указывает ссылка, например, присвоить ей новый объект. Для типов значений можно передавать по ссылке, но если у вас нет проблем с производительностью, я бы не стал этого делать. Особенно если рассматриваемые типы маленькие (4 байта или меньше), то выигрыш в производительности будет незначительным или вообще отсутствовать, возможно, даже будет штраф.
Насколько я понимаю, у вас есть класс с одними полями и конструктор, который присваивает параметры этим полям, верно?
Если это так, то я бы счел использование ref в конструкторе плохой практикой. Если вы присваиваете параметр полю в этом классе, он в любом случае хранится по значению. Так что если вы не меняете значение в конструкторе, то нет необходимости использовать его по ссылке.
Если класс хранит только параметры, может быть, стоит использовать struct?
Может быть, это представляет интерес?
Нет. Передача параметров по ссылке увеличивает накладные расходы, поэтому это только снизит производительность.